Revision 629 org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/test/java/org/gvsig/tools/dynobject/impl/DefaultDynClassTest.java

View differences:

DefaultDynClassTest.java
26 26
 */
27 27
package org.gvsig.tools.dynobject.impl;
28 28

  
29
import java.util.ArrayList;
30
import java.util.Arrays;
31
import java.util.List;
32

  
29 33
import org.easymock.MockControl;
30 34

  
31 35
import org.gvsig.tools.ToolsLocator;
......
34 38
import org.gvsig.tools.dynobject.DynField;
35 39
import org.gvsig.tools.dynobject.DynObject;
36 40
import org.gvsig.tools.dynobject.DynObjectManager;
41
import org.gvsig.tools.dynobject.DynObjectValueItem;
42
import org.gvsig.tools.dynobject.DynStruct;
37 43
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
38 44

  
39 45
/**
......
43 49
 */
44 50
public class DefaultDynClassTest extends AbstractLibraryAutoInitTestCase {
45 51

  
46
    private MockControl managerControl;
47
    private DynObjectManager manager;
48
    private DefaultDynClass dynClass;
52
	private MockControl managerControl;
53
	private DynObjectManager manager;
54
	private DefaultDynClass dynClass;
49 55

  
50
    protected void doSetUp() throws Exception {
51
        managerControl = MockControl.createNiceControl(DynObjectManager.class);
52
        manager = (DynObjectManager) managerControl.getMock();
53
        dynClass =
54
            new DefaultDynClass(manager, new DefaultDynClassName("dynclass"),
55
                "description");
56
    }
56
	protected void doSetUp() throws Exception {
57
		managerControl = MockControl.createNiceControl(DynObjectManager.class);
58
		manager = (DynObjectManager) managerControl.getMock();
59
		dynClass = new DefaultDynClass(manager, new DefaultDynClassName(
60
				"dynclass"), "description");
61
	}
57 62

  
58
    /**
59
     * Test method for
60
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#newInstance()}.
61
     */
62
    // public void testNewInstance() {
63
    // TODO: solve
64
    // MockControl dynObjControl = MockControl
65
    // .createNiceControl(DynObject.class);
66
    // DynObject dynObj = (DynObject) dynObjControl.getMock();
67
    // dynObjControl.expectAndReturn(dynObj.getDynClass(), dynClass);
68
    // dynObjControl.replay();
69
    //
70
    // managerControl.expectAndReturn(manager.createDynObject(dynClass),
71
    // dynObj);
72
    // managerControl.replay();
73
    //
74
    // DynObject newDynObj = dynClass.newInstance();
75
    // assertTrue(dynClass.isInstance(newDynObj));
76
    // }
63
	/**
64
	 * Test method for
65
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#newInstance()}.
66
	 */
67
	// public void testNewInstance() {
68
	// TODO: solve
69
	// MockControl dynObjControl = MockControl
70
	// .createNiceControl(DynObject.class);
71
	// DynObject dynObj = (DynObject) dynObjControl.getMock();
72
	// dynObjControl.expectAndReturn(dynObj.getDynClass(), dynClass);
73
	// dynObjControl.replay();
74
	//
75
	// managerControl.expectAndReturn(manager.createDynObject(dynClass),
76
	// dynObj);
77
	// managerControl.replay();
78
	//
79
	// DynObject newDynObj = dynClass.newInstance();
80
	// assertTrue(dynClass.isInstance(newDynObj));
81
	// }
77 82

  
78
    /**
79
     * Test method for
80
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(org.gvsig.tools.dynobject.DynClass)}
81
     * .
82
     */
83
    public void testExtendDynClass() {
84
        final String parent = "parent";
83
	/**
84
	 * Test method for
85
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(org.gvsig.tools.dynobject.DynClass)}
86
	 * .
87
	 */
88
	public void testExtendDynClass() {
89
		final String parent = "parent";
85 90

  
86
        DefaultDynClassName name = new DefaultDynClassName(parent);
91
		DefaultDynClassName name = new DefaultDynClassName(parent);
87 92

  
88
        DefaultDynClass parentDynClass =
89
            new DefaultDynClass(manager, name, "parent description");
93
		DefaultDynClass parentDynClass = new DefaultDynClass(manager, name,
94
				"parent description");
90 95

  
91
        managerControl.expectAndReturn(manager.has(parent), true);
92
        managerControl.expectAndReturn(manager.get(parent), parentDynClass);
93
        managerControl.replay();
96
		managerControl.expectAndReturn(manager.has(parent), true);
97
		managerControl.expectAndReturn(manager.get(parent), parentDynClass);
98
		managerControl.replay();
94 99

  
95
        dynClass.extend(parentDynClass);
100
		dynClass.extend(parentDynClass);
96 101

  
97
        DynClass[] parents = dynClass.getSuperDynClasses();
98
        assertEquals(parentDynClass, parents[0]);
99
    }
102
		DynClass[] parents = dynClass.getSuperDynClasses();
103
		assertEquals(parentDynClass, parents[0]);
104
	}
100 105

  
101
    /**
102
     * Test method for
103
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(java.lang.String)}
104
     * .
105
     */
106
    public void testExtendString() {
107
        final String parent = "parent";
106
	/**
107
	 * Test method for
108
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#extend(java.lang.String)}
109
	 * .
110
	 */
111
	public void testExtendString() {
112
		final String parent = "parent";
108 113

  
109
        DefaultDynClassName name = new DefaultDynClassName(parent);
114
		DefaultDynClassName name = new DefaultDynClassName(parent);
110 115

  
111
        DefaultDynClass parentDynClass =
112
            new DefaultDynClass(manager, name, "parent description");
116
		DefaultDynClass parentDynClass = new DefaultDynClass(manager, name,
117
				"parent description");
113 118

  
114
        managerControl.expectAndReturn(manager.has(parent), true);
115
        managerControl.expectAndReturn(manager.get(parent), parentDynClass);
116
        managerControl.replay();
119
		managerControl.expectAndReturn(manager.has(parent), true);
120
		managerControl.expectAndReturn(manager.get(parent), parentDynClass);
121
		managerControl.replay();
117 122

  
118
        dynClass.extend(parent);
123
		dynClass.extend(parent);
119 124

  
120
        DynClass[] parents = dynClass.getSuperDynClasses();
121
        assertEquals(parentDynClass, parents[0]);
122
    }
125
		DynClass[] parents = dynClass.getSuperDynClasses();
126
		assertEquals(parentDynClass, parents[0]);
127
	}
123 128

  
124
    /**
125
     * Test method for
126
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDynField(java.lang.String)}
127
     * ,
128
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#addDynField(java.lang.String)}
129
     * ,
130
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#removeDynField(java.lang.String)}
131
     * ,
132
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDeclaredDynFields()}
133
     * .
134
     */
135
    public void testDynFields() {
136
        final String field1 = "field1";
137
        final String field2 = "field2";
129
	/**
130
	 * Test method for
131
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDynField(java.lang.String)}
132
	 * ,
133
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#addDynField(java.lang.String)}
134
	 * ,
135
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#removeDynField(java.lang.String)}
136
	 * ,
137
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#getDeclaredDynFields()}
138
	 * .
139
	 */
140
	public void testDynFields() {
141
		final String field1 = "field1";
142
		final String field2 = "field2";
138 143

  
139
        DynField dynField1 = dynClass.addDynField(field1);
140
        assertEquals(dynField1, dynClass.getDynField(field1));
144
		DynField dynField1 = dynClass.addDynField(field1);
145
		assertEquals(dynField1, dynClass.getDynField(field1));
141 146

  
142
        DynField dynField2 = dynClass.addDynField(field2);
143
        assertEquals(dynField2, dynClass.getDynField(field2));
147
		DynField dynField2 = dynClass.addDynField(field2);
148
		assertEquals(dynField2, dynClass.getDynField(field2));
144 149

  
145
        DynField[] fields = dynClass.getDeclaredDynFields();
146
        assertEquals(2, fields.length);
150
		DynField[] fields = dynClass.getDeclaredDynFields();
151
		assertEquals(2, fields.length);
147 152

  
148
        dynClass.removeDynField(field1);
149
        assertNull(dynClass.getDynField(field1));
150
    }
153
		dynClass.removeDynField(field1);
154
		assertNull(dynClass.getDynField(field1));
155
	}
151 156

  
152
    /**
153
     * Test method for
154
     * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#equals(Object)}.
155
     */
156
    public void testEquals() {
157
        DefaultDynClass dynClass2 =
158
            new DefaultDynClass(manager, new DefaultDynClassName("dynclass2"),
159
                "description2");
160
        DefaultDynClass dynClassB =
161
            new DefaultDynClass(manager, new DefaultDynClassName("dynclass"),
162
                "description");
157
	/**
158
	 * Test method for
159
	 * {@link org.gvsig.tools.dynobject.impl.DefaultDynClass#equals(Object)}.
160
	 */
161
	public void testEquals() {
162
		DefaultDynClass dynClass2 = new DefaultDynClass(manager,
163
				new DefaultDynClassName("dynclass2"), "description2");
164
		DefaultDynClass dynClassB = new DefaultDynClass(manager,
165
				new DefaultDynClassName("dynclass"), "description");
163 166

  
164
        assertTrue(dynClass.equals(dynClassB));
165
        assertFalse(dynClass.equals(dynClass2));
166
        assertFalse(dynClass.equals(null));
167
    }
167
		assertTrue(dynClass.equals(dynClassB));
168
		assertFalse(dynClass.equals(dynClass2));
169
		assertFalse(dynClass.equals(null));
170
	}
168 171

  
169
    /**
170
     * Validation test: DynObjects as dynfields within a dynObject.
171
     * 
172
     * Metadata A will have metadata B as porperty. for each dynField, a
173
     * validate function will be triggered with the current
174
     * 
175
     * @throws Exception
176
     * 
177
     */
178
    public void testValidate() throws Exception {
172
	/**
173
	 * Validation test: DynObjects as dynfields within a dynObject.
174
	 * 
175
	 * Metadata A will have metadata B as porperty. for each dynField, a
176
	 * validate function will be triggered with the current
177
	 * 
178
	 * @throws Exception
179
	 * 
180
	 */
181
	public void testValidate() throws Exception {
179 182

  
180
        /**
181
         * Creating and registering both dynClasses
182
         */
183
        DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
183
		/**
184
		 * Creating and registering both dynClasses
185
		 */
186
		DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
184 187

  
185
        DynClass dynClassA =
186
            new DefaultDynClass(manager, new DefaultDynClassName("metadata",
187
                "DynclassA"), "descriptionA");
188
        dynManager.add(dynClassA);
188
		DynClass dynClassA = new DefaultDynClass(manager,
189
				new DefaultDynClassName("metadata", "DynclassA"),
190
				"descriptionA");
191
		dynManager.add(dynClassA);
189 192

  
190
        DynClass dynClassB =
191
            new DefaultDynClass(manager, new DefaultDynClassName("metadata",
192
                "DynclassB"), "descriptionB");
193
        dynManager.add(dynClassB);
193
		DynClass dynClassB = new DefaultDynClass(manager,
194
				new DefaultDynClassName("metadata", "DynclassB"),
195
				"descriptionB");
196
		dynManager.add(dynClassB);
194 197

  
195
        /**
196
         * Filling dynClass B with "Name" and "Street"
197
         */
198
		/**
199
		 * Filling dynClass B with "Name" and "Street"
200
		 */
198 201
		dynClassB.addDynFieldString("name");
199
        dynClassB.addDynFieldString("street");
202
		dynClassB.addDynFieldString("street");
200 203

  
201
        /**
202
         * Filling dynClass A with "Name" and the dynClass B named "dynObjB"
203
         */
204
		/**
205
		 * Filling dynClass A with "Name" and the dynClass B named "dynObjB"
206
		 */
204 207
		dynClassA.addDynFieldString("name");
205
        dynClassA.addDynField("dynObjB").setType(DataTypes.DYNOBJECT)
206
            .setSubtype(dynClassB.getFullName());
208
		dynClassA.addDynField("dynObjB").setType(DataTypes.DYNOBJECT)
209
				.setSubtype(dynClassB.getFullName());
207 210

  
208
        /**
209
         * Creating dynObjects for current dynClasses and applying dynObject B
210
         * as a property of A
211
         */
212
        DynObject dynObjA = new DefaultDynObject(dynClassA);
213
        DynObject dynObjB = new DefaultDynObject(dynClassB);
211
		/**
212
		 * Creating dynObjects for current dynClasses and applying dynObject B
213
		 * as a property of A
214
		 */
215
		DynObject dynObjA = new DefaultDynObject(dynClassA);
216
		DynObject dynObjB = new DefaultDynObject(dynClassB);
214 217

  
215
        // TODO: Note that even specified a subType, if we set a different
216
        // dynObject, it will not check if the subType is correct.
217
        dynObjA.setDynValue("dynObjB", dynObjB);
218
		// TODO: Note that even specified a subType, if we set a different
219
		// dynObject, it will not check if the subType is correct.
220
		dynObjA.setDynValue("dynObjB", dynObjB);
218 221

  
219
        /**
220
         * Once the structure has been created, we will validate each field of
221
         * dynObject A, which also contains B as a property.
222
         */
223
        DynField[] fields = dynObjA.getDynClass().getDynFields();
224
        DynField field;
225
        Object value;
226
        for (int i = 0; i < fields.length; ++i) {
227
            field = fields[i];
228
            value = dynObjA.getDynValue(field.getName());
222
		/**
223
		 * Once the structure has been created, we will validate each field of
224
		 * dynObject A, which also contains B as a property.
225
		 */
226
		DynField[] fields = dynObjA.getDynClass().getDynFields();
227
		DynField field;
228
		Object value;
229
		for (int i = 0; i < fields.length; ++i) {
230
			field = fields[i];
231
			value = dynObjA.getDynValue(field.getName());
229 232

  
230
            // Checking that it actually contains the DynObject B as a
231
            // property
232
            if (field.getType() == DataTypes.DYNOBJECT) {
233
                assertTrue(dynClassB.equals(((DynObject) value).getDynClass()));
234
            }
233
			// Checking that it actually contains the DynObject B as a
234
			// property
235
			if (field.getType() == DataTypes.DYNOBJECT) {
236
				assertTrue(dynClassB.equals(((DynObject) value).getDynClass()));
237
			}
235 238

  
236
            // Performing validation
237
            field.validate(value);
238
        }
239
    }
239
			// Performing validation
240
			field.validate(value);
241
		}
242
	}
243

  
244
	/**
245
	 * 
246
	 * Duplicate test: checking if, given two dynClasses A and B, dynFields from
247
	 * class A can be duplicated into dynClass B by using setters in B with the
248
	 * returned values of getters of A as input.
249
	 * 
250
	 */
251
	public void testSetters() {
252
		/**
253
		 * Creating and registering both dynClasses
254
		 */
255
		DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
256

  
257
		DynClass dynClassA = new DefaultDynClass(manager,
258
				new DefaultDynClassName("metadata", "DynclassA"),
259
				"descriptionA");
260

  
261
		DynClass dynClassB = new DefaultDynClass(manager,
262
				new DefaultDynClassName("metadata", "DynclassB"),
263
				"descriptionB");
264

  
265
		/**
266
		 * Filling dynClass B with "Name" and "Street"
267
		 */
268
		dynClassB.addDynFieldString("name");
269
		dynClassB.addDynFieldString("street");
270

  
271
		fillInitialDynfields(dynClassA, dynClassB.getFullName());
272

  
273
		// /**
274
		// * Creating dynObjects for current dynClasses and applying dynObject B
275
		// * as a property of A
276
		// */
277
		// DynObject dynObjA = new DefaultDynObject(dynClassA);
278
		// DynObject dynObjB = new DefaultDynObject(dynClassB);
279

  
280
		copyDefinitions(dynClassA, dynClassB);
281

  
282
		checkValues(dynClassA, dynClassB);
283
	}
284

  
285
	private List createList(Object[] values) {
286
		DynObjectValueItem[] valueItems = new DynObjectValueItem[values.length];
287
		for (int i = 0; i < values.length; i++) {
288
			valueItems[i] = new DynObjectValueItem(values[i]);
289
		}
290
		return Arrays.asList(valueItems);
291
	}
292

  
293
	/**
294
	 * Filling dynClass A with different parameters that will be duplicated into
295
	 * dynClass B afterwards.
296
	 */
297
	private void fillInitialDynfields(DynClass definition,
298
			String dynClassBFullName) {
299

  
300
		List items = new ArrayList();
301

  
302
		definition.addDynFieldString("name");
303
		definition.addDynField("dynObjB").setType(DataTypes.DYNOBJECT)
304
				.setSubtype(dynClassBFullName);
305

  
306
		definition.addDynFieldString("id").setReadOnly(true); // optional
307

  
308
		definition.addDynFieldString("language").setMandatory(true);
309

  
310
		definition.addDynFieldString("charachterset").setMandatory(true)
311
				.setAvailableValues(createList(new String[] { "a", "b", "c" }));
312

  
313
		definition
314
				.addDynFieldList("hierarchyLevels")
315
				.setElementsType(DataTypes.STRING)
316
				.setMandatory(true)
317
				.getElementsType()
318
				.setAvailableValues(
319
						createList(new String[] { "hier1", "hier2", "hier3" }));
320

  
321
		definition.addDynFieldDate("date").setMandatory(true);
322

  
323
		definition.addDynFieldList("keywords")
324
				.setElementsType(DataTypes.STRING);
325

  
326
		definition.addDynFieldList("dynObjects")
327
				.setElementsType(DataTypes.DYNOBJECT).setMandatory(true)
328
				.setSubtype(dynClassBFullName).getElementsType()
329
				.setSubtype(dynClassBFullName);
330

  
331
	}
332

  
333
	private void copyDefinitions(DynClass dynClassA, DynClass dynClassB) {
334
		DynField field;
335
		DynField fields[] = dynClassA.getDynFields();
336
		for (int i = 0; i < fields.length; i++) {
337
			field = fields[i];
338
			;
339
			if (dynClassB.getDynField(field.getName()) == null) {
340
				addDynField(dynClassB, field);
341
			}
342
		}
343

  
344
		// dynFields must have the same number of items or more if some items
345
		// have been previously defined.
346
		assertTrue(dynClassB.getDynFields().length >= fields.length);
347
	}
348

  
349
	private void copyValues(DynObject oldDefinition, DynObject newDefinition) {
350
		Object value;
351
		DynField field;
352
		DynField fields[] = oldDefinition.getDynClass().getDynFields();
353
		for (int i = 0; i < fields.length; i++) {
354
			field = fields[i];
355
			value = oldDefinition.getDynValue(field.getName());
356
			if (newDefinition.getDynClass().getDynField(field.getName()) == null) {
357
				addDynField(newDefinition.getDynClass(), field);
358
			}
359
			if (value == null) {
360
				continue;
361
			}
362
			if (value instanceof DynObject) {
363
				DynObject parent = (DynObject) value;
364
				DynStruct parentDefinition = parent.getDynClass();
365
				DynClass childDefinition = manager.get(
366
						parentDefinition.getName(),
367
						parentDefinition.getNamespace());
368
				DynObject child = manager.createDynObject(childDefinition);
369

  
370
				copyValues(child, parent);
371
				newDefinition.setDynValue(field.getName(), child);
372

  
373
			} else {
374
				newDefinition.setDynValue(field.getName(), value);
375
			}
376
		}
377
	}
378

  
379
	private void addDynField(DynStruct definition, DynField field) {
380
		DynField dynField = definition.addDynField(field.getName())
381
				.setType(field.getType()).setSubtype(field.getSubtype())
382
				.setAvailableValues(field.getAvailableValues())
383
				.setClassOfItems(field.getClassOfItems())
384
				.setClassOfValue(field.getClassOfValue())
385
				.setDefaultFieldValue(field.getDefaultValue())
386
				.setDescription(field.getDescription())
387
				.setGroup(field.getGroup()).setHidden(field.isHidden())
388
				.setMandatory(field.isMandatory())
389
				.setMaxValue(field.getMaxValue())
390
				.setMinValue(field.getMinValue()).setOrder(field.getOder())
391
				.setPersistent(field.isPersistent())
392
				.setReadOnly(field.isReadOnly());
393

  
394
		copyElementsType(dynField, field.getElementsType());
395
	}
396

  
397
	private void copyElementsType(DynField dynField, DynField elementsType) {
398
		if (elementsType == null) {
399
			return;
400
		}
401

  
402
		dynField.setElementsType(elementsType.getType());
403
		dynField.getElementsType().setSubtype(elementsType.getSubtype())
404
				.setAvailableValues(elementsType.getAvailableValues())
405
				.setClassOfItems(elementsType.getClassOfItems())
406
				.setClassOfValue(elementsType.getClassOfValue())
407
				.setDefaultFieldValue(elementsType.getDefaultValue())
408
				.setDescription(elementsType.getDescription())
409
				.setGroup(elementsType.getGroup())
410
				.setHidden(elementsType.isHidden())
411
				.setMandatory(elementsType.isMandatory())
412
				.setMaxValue(elementsType.getMaxValue())
413
				.setMinValue(elementsType.getMinValue())
414
				.setOrder(elementsType.getOder())
415
				.setPersistent(elementsType.isPersistent())
416
				.setReadOnly(elementsType.isReadOnly());
417
	}
418

  
419
	private void checkValues(DynClass dynObjA, DynClass dynObjB) {
420
		DynField[] dynFieldsA = dynObjA.getDynFields();
421
		DynField[] dynFieldsB = dynObjB.getDynFields();
422

  
423
		DynField field;
424
		boolean done = false;
425
		for (int i = 0; i < dynFieldsA.length; ++i) {
426
			field = dynFieldsA[i];
427
			for (int j = 0; j < dynFieldsB.length; ++j) {
428
				if (dynFieldsB[j].getName().equals(field.getName())) {
429
					checkDynField(field, dynFieldsB[j]);
430
					done = true;
431
				}
432
			}
433
			// dynField must be defined in both lists.
434
			assertTrue(done);
435

  
436
		}
437
	}
438

  
439
	private void checkDynField(DynField fieldA, DynField fieldB) {
440

  
441
		assertEquals(fieldA.getName(), fieldA.getName());
442
		assertEquals(fieldA.getType(), fieldB.getType());
443
		assertEquals(fieldA.getSubtype(), fieldB.getSubtype());
444
		assertEquals(fieldA.getAvailableValues(), fieldB.getAvailableValues());
445
		assertEquals(fieldA.getClassOfItems(), fieldB.getClassOfItems());
446
		assertEquals(fieldA.getClassOfValue(), fieldB.getClassOfValue());
447
		assertEquals(fieldA.getDefaultValue(), fieldB.getDefaultValue());
448
		assertEquals(fieldA.getDescription(), fieldB.getDescription());
449
		assertEquals(fieldA.getGroup(), fieldB.getGroup());
450
		assertEquals(fieldA.isHidden(), fieldB.isHidden());
451
		assertEquals(fieldA.isMandatory(), fieldB.isMandatory());
452
		assertEquals(fieldA.getMaxValue(), fieldB.getMaxValue());
453
		assertEquals(fieldA.getMinValue(), fieldB.getMinValue());
454
		assertEquals(fieldA.getOder(), fieldB.getOder());
455
		assertEquals(fieldA.isPersistent(), fieldB.isPersistent());
456
		assertEquals(fieldA.isReadOnly(), fieldB.isReadOnly());
457

  
458
	}
459

  
240 460
}

Also available in: Unified diff