001/*
002 * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
003 * Copyright (C) 2000-2011 The Gridarta Developers.
004 *
005 * This program is free software; you can redistribute it and/or modify
006 * it under the terms of the GNU General Public License as published by
007 * the Free Software Foundation; either version 2 of the License, or
008 * (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU General Public License for more details.
014 *
015 * You should have received a copy of the GNU General Public License along
016 * with this program; if not, write to the Free Software Foundation, Inc.,
017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
018 */
019
020package net.sf.gridarta.plugin.parameter;
021
022import java.io.File;
023import java.io.IOException;
024import java.io.StringReader;
025import java.io.StringWriter;
026import java.io.Writer;
027import java.util.Collections;
028import net.sf.gridarta.model.archetype.TestArchetype;
029import net.sf.gridarta.model.filter.NamedFilter;
030import net.sf.gridarta.model.filter.NamedFilterConfig;
031import net.sf.gridarta.model.gameobject.TestGameObject;
032import net.sf.gridarta.model.maparchobject.TestMapArchObject;
033import net.sf.gridarta.model.mapcontrol.MapControl;
034import net.sf.gridarta.model.mapcontrol.TestMapControlCreator;
035import net.sf.gridarta.model.mapmodel.TestMapModelCreator;
036import net.sf.gridarta.model.match.NamedGameObjectMatcher;
037import net.sf.gridarta.utils.Size2D;
038import org.jdom.Document;
039import org.jdom.Element;
040import org.jdom.JDOMException;
041import org.jdom.input.SAXBuilder;
042import org.jdom.output.Format;
043import org.jdom.output.XMLOutputter;
044import org.jetbrains.annotations.NotNull;
045import org.junit.Assert;
046import org.junit.Ignore;
047import org.junit.Test;
048
049/**
050 * Regression tests for {@link PluginParameterCodec}.
051 * @author Andreas Kirschbaum
052 */
053public class PluginParameterCodecTest {
054
055    /**
056     * Checks that an {@link ArchetypeParameter} instance is correctly encoded.
057     * @throws IOException if the test fails
058     */
059    @Test
060    public void testArchetypeToXml1() throws IOException {
061        final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false);
062        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new ArchetypeParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapModelCreator.getArchetypeSet());
063        final StringBuilder sb = new StringBuilder();
064        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
065        sb.append("<parameter>\r\n");
066        sb.append("  <name>[name]</name>\r\n");
067        sb.append("  <description>[description]</description>\r\n");
068        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
069        sb.append("  <value />\r\n");
070        sb.append("</parameter>\r\n");
071        sb.append("\r\n");
072        Assert.assertEquals(sb.toString(), toXML(parameter));
073    }
074
075    /**
076     * Checks that an {@link ArchetypeParameter} instance is correctly encoded.
077     * @throws IOException if the test fails
078     */
079    @Test
080    public void testArchetypeToXml2() throws IOException {
081        final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false);
082        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new ArchetypeParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapModelCreator.getArchetypeSet());
083        parameter.setStringValue("undefined_archetype");
084        final StringBuilder sb = new StringBuilder();
085        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
086        sb.append("<parameter>\r\n");
087        sb.append("  <name>[name]</name>\r\n");
088        sb.append("  <description>[description]</description>\r\n");
089        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
090        sb.append("  <value>undefined_archetype</value>\r\n");
091        sb.append("</parameter>\r\n");
092        sb.append("\r\n");
093        Assert.assertEquals(sb.toString(), toXML(parameter));
094    }
095
096    /**
097     * Checks that an {@link ArchetypeParameter} instance is correctly encoded.
098     * @throws IOException if the test fails
099     */
100    @Test
101    public void testArchetypeToXml3() throws IOException {
102        final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false);
103        final TestArchetype archetype = mapModelCreator.getArchetype("existing_archetype");
104        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new ArchetypeParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapModelCreator.getArchetypeSet());
105        parameter.setStringValue(archetype.getArchetypeName());
106        final StringBuilder sb = new StringBuilder();
107        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
108        sb.append("<parameter>\r\n");
109        sb.append("  <name>[name]</name>\r\n");
110        sb.append("  <description>[description]</description>\r\n");
111        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
112        sb.append("  <value>existing_archetype</value>\r\n");
113        sb.append("</parameter>\r\n");
114        sb.append("\r\n");
115        Assert.assertEquals(sb.toString(), toXML(parameter));
116    }
117
118    /**
119     * Checks that a {@link BooleanParameter} instance is correctly encoded.
120     * @throws IOException if the test fails
121     */
122    @Test
123    public void testBooleanToXml1() throws IOException {
124        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new BooleanParameter<TestGameObject, TestMapArchObject, TestArchetype>();
125        parameter.setName("Name");
126        parameter.setDescription("Description");
127        final StringBuilder sb = new StringBuilder();
128        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
129        sb.append("<parameter>\r\n");
130        sb.append("  <name>Name</name>\r\n");
131        sb.append("  <description>Description</description>\r\n");
132        sb.append("  <type>java.lang.Boolean</type>\r\n");
133        sb.append("  <value>false</value>\r\n");
134        sb.append("  <trueText>Yes</trueText>\r\n");
135        sb.append("  <falseText>No</falseText>\r\n");
136        sb.append("</parameter>\r\n");
137        sb.append("\r\n");
138        Assert.assertEquals(sb.toString(), toXML(parameter));
139    }
140
141    /**
142     * Checks that a {@link BooleanParameter} instance is correctly encoded.
143     * @throws IOException if the test fails
144     */
145    @Test
146    public void testBooleanToXml2() throws IOException {
147        final BooleanParameter<TestGameObject, TestMapArchObject, TestArchetype> parameter = new BooleanParameter<TestGameObject, TestMapArchObject, TestArchetype>();
148        parameter.setStringValue("true");
149        parameter.setTrueText("true-text");
150        parameter.setFalseText("false-text");
151        final StringBuilder sb = new StringBuilder();
152        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
153        sb.append("<parameter>\r\n");
154        sb.append("  <name>[name]</name>\r\n");
155        sb.append("  <description>[description]</description>\r\n");
156        sb.append("  <type>java.lang.Boolean</type>\r\n");
157        sb.append("  <value>true</value>\r\n");
158        sb.append("  <trueText>true-text</trueText>\r\n");
159        sb.append("  <falseText>false-text</falseText>\r\n");
160        sb.append("</parameter>\r\n");
161        sb.append("\r\n");
162        Assert.assertEquals(sb.toString(), toXML(parameter));
163    }
164
165    /**
166     * Checks that a {@link DoubleParameter} instance is correctly encoded.
167     * @throws IOException if the test fails
168     */
169    @Test
170    public void testDoubleToXml1() throws IOException {
171        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new DoubleParameter<TestGameObject, TestMapArchObject, TestArchetype>();
172        parameter.setName("Name");
173        parameter.setDescription("Description");
174        final StringBuilder sb = new StringBuilder();
175        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
176        sb.append("<parameter>\r\n");
177        sb.append("  <name>Name</name>\r\n");
178        sb.append("  <description>Description</description>\r\n");
179        sb.append("  <type>java.lang.Double</type>\r\n");
180        sb.append("  <value>0.0</value>\r\n");
181        sb.append("  <minimum>0.0</minimum>\r\n");
182        sb.append("  <maximum>1.0</maximum>\r\n");
183        sb.append("</parameter>\r\n");
184        sb.append("\r\n");
185        Assert.assertEquals(sb.toString(), toXML(parameter));
186    }
187
188    /**
189     * Checks that a {@link DoubleParameter} instance is correctly encoded.
190     * @throws IOException if the test fails
191     */
192    @Test
193    public void testDoubleToXml2() throws IOException {
194        final DoubleParameter<TestGameObject, TestMapArchObject, TestArchetype> parameter = new DoubleParameter<TestGameObject, TestMapArchObject, TestArchetype>();
195        parameter.setMin(-123.456);
196        parameter.setMax(234.0);
197        parameter.setValue(12.34);
198        final StringBuilder sb = new StringBuilder();
199        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
200        sb.append("<parameter>\r\n");
201        sb.append("  <name>[name]</name>\r\n");
202        sb.append("  <description>[description]</description>\r\n");
203        sb.append("  <type>java.lang.Double</type>\r\n");
204        sb.append("  <value>12.34</value>\r\n");
205        sb.append("  <minimum>-123.456</minimum>\r\n");
206        sb.append("  <maximum>234.0</maximum>\r\n");
207        sb.append("</parameter>\r\n");
208        sb.append("\r\n");
209        Assert.assertEquals(sb.toString(), toXML(parameter));
210    }
211
212    /**
213     * Checks that a {@link FilterParameter} instance is correctly encoded.
214     * @throws IOException if the test fails
215     */
216    @Ignore
217    @Test
218    public void testFilterToXml1() throws IOException {
219        final Iterable<NamedGameObjectMatcher> matchers = Collections.emptyList();
220        final NamedFilter namedFilter = new NamedFilter(matchers);
221        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new FilterParameter<TestGameObject, TestMapArchObject, TestArchetype>(namedFilter);
222        parameter.setName("Name");
223        parameter.setDescription("Description");
224        final StringBuilder sb = new StringBuilder();
225        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
226        sb.append("<parameter>\r\n");
227        sb.append("  <name>Name</name>\r\n");
228        sb.append("  <description>Description</description>\r\n");
229        sb.append("  <type>net.sf.gridarta.model.filter.NamedFilterConfig</type>\r\n");
230        sb.append("  <value>\r\n");
231        sb.append("    <enabled>false</enabled>\r\n");
232        sb.append("    <inverted>false</inverted>\r\n");
233        sb.append("  </value>\r\n");
234        sb.append("</parameter>\r\n");
235        sb.append("\r\n");
236        Assert.assertEquals(sb.toString(), toXML(parameter));
237    }
238
239    /**
240     * Checks that a {@link FilterParameter} instance is correctly encoded.
241     * @throws IOException if the test fails
242     */
243    @Ignore
244    @Test
245    public void testFilterToXml2() throws IOException {
246        final Iterable<NamedGameObjectMatcher> matchers = Collections.emptyList();
247        final NamedFilter namedFilter = new NamedFilter(matchers);
248        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new FilterParameter<TestGameObject, TestMapArchObject, TestArchetype>(namedFilter);
249        final NamedFilterConfig config = namedFilter.createConfig();
250        config.setInverted(true);
251        config.setEnabled(true);
252        //XXX:parameter.setValue(config);
253        final StringBuilder sb = new StringBuilder();
254        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
255        sb.append("<parameter>\r\n");
256        sb.append("  <name>[name]</name>\r\n");
257        sb.append("  <description>[description]</description>\r\n");
258        sb.append("  <type>net.sf.gridarta.model.filter.NamedFilterConfig</type>\r\n");
259        sb.append("  <value>\r\n");
260        sb.append("    <enabled>true</enabled>\r\n");
261        sb.append("    <inverted>true</inverted>\r\n");
262        sb.append("  </value>\r\n");
263        sb.append("</parameter>\r\n");
264        sb.append("\r\n");
265        Assert.assertEquals(sb.toString(), toXML(parameter));
266    }
267
268    /**
269     * Checks that an {@link IntegerParameter} instance is correctly encoded.
270     * @throws IOException if the test fails
271     */
272    @Test
273    public void testIntegerToXml1() throws IOException {
274        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new IntegerParameter<TestGameObject, TestMapArchObject, TestArchetype>();
275        parameter.setName("Name");
276        parameter.setDescription("Description");
277        final StringBuilder sb = new StringBuilder();
278        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
279        sb.append("<parameter>\r\n");
280        sb.append("  <name>Name</name>\r\n");
281        sb.append("  <description>Description</description>\r\n");
282        sb.append("  <type>java.lang.Integer</type>\r\n");
283        sb.append("  <value>0</value>\r\n");
284        sb.append("  <minimum>-2147483648</minimum>\r\n");
285        sb.append("  <maximum>2147483647</maximum>\r\n");
286        sb.append("</parameter>\r\n");
287        sb.append("\r\n");
288        Assert.assertEquals(sb.toString(), toXML(parameter));
289    }
290
291    /**
292     * Checks that an {@link IntegerParameter} instance is correctly encoded.
293     * @throws IOException if the test fails
294     */
295    @Test
296    public void testIntegerToXml2() throws IOException {
297        final IntegerParameter<TestGameObject, TestMapArchObject, TestArchetype> parameter = new IntegerParameter<TestGameObject, TestMapArchObject, TestArchetype>();
298        parameter.setMin(-123);
299        parameter.setMax(234);
300        parameter.setValue(2);
301        final StringBuilder sb = new StringBuilder();
302        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
303        sb.append("<parameter>\r\n");
304        sb.append("  <name>[name]</name>\r\n");
305        sb.append("  <description>[description]</description>\r\n");
306        sb.append("  <type>java.lang.Integer</type>\r\n");
307        sb.append("  <value>2</value>\r\n");
308        sb.append("  <minimum>-123</minimum>\r\n");
309        sb.append("  <maximum>234</maximum>\r\n");
310        sb.append("</parameter>\r\n");
311        sb.append("\r\n");
312        Assert.assertEquals(sb.toString(), toXML(parameter));
313    }
314
315    /**
316     * Checks that a {@link MapParameter} instance is correctly encoded.
317     * @throws IOException if the test fails
318     */
319    @Test
320    public void testMapToXml1() throws IOException {
321        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
322        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new MapParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapControlCreator.getMapManager());
323        parameter.setName("Name");
324        parameter.setDescription("Description");
325        final StringBuilder sb = new StringBuilder();
326        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
327        sb.append("<parameter>\r\n");
328        sb.append("  <name>Name</name>\r\n");
329        sb.append("  <description>Description</description>\r\n");
330        sb.append("  <type>net.sf.gridarta.model.mapcontrol.MapControl</type>\r\n");
331        sb.append("  <value />\r\n");
332        sb.append("</parameter>\r\n");
333        sb.append("\r\n");
334        Assert.assertEquals(sb.toString(), toXML(parameter));
335    }
336
337    /**
338     * Checks that a {@link MapParameter} instance is correctly encoded.
339     * @throws IOException if the test fails
340     */
341    @Test
342    public void testMapToXml2() throws IOException {
343        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
344        final MapParameter<TestGameObject, TestMapArchObject, TestArchetype> parameter = new MapParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapControlCreator.getMapManager());
345        parameter.setValueToCurrent();
346        final StringBuilder sb = new StringBuilder();
347        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
348        sb.append("<parameter>\r\n");
349        sb.append("  <name>[name]</name>\r\n");
350        sb.append("  <description>[description]</description>\r\n");
351        sb.append("  <type>net.sf.gridarta.model.mapcontrol.MapControl</type>\r\n");
352        sb.append("  <value />\r\n");
353        sb.append("</parameter>\r\n");
354        sb.append("\r\n");
355        Assert.assertEquals(sb.toString(), toXML(parameter));
356    }
357
358    /**
359     * Checks that a {@link MapParameter} instance is correctly encoded.
360     * @throws IOException if the test fails
361     */
362    @Test
363    public void testMapToXml3() throws IOException {
364        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
365        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new MapParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapControlCreator.getMapManager());
366        final File mapDir = new File("/tmp");
367        final String mapPath = "path/to/map";
368        mapControlCreator.newMapControl(new File(mapDir, mapPath), "map name", new Size2D(13, 15));
369        parameter.setStringValue("/" + mapPath);
370        final StringBuilder sb = new StringBuilder();
371        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
372        sb.append("<parameter>\r\n");
373        sb.append("  <name>[name]</name>\r\n");
374        sb.append("  <description>[description]</description>\r\n");
375        sb.append("  <type>net.sf.gridarta.model.mapcontrol.MapControl</type>\r\n");
376        sb.append("  <value>/path/to/map</value>\r\n");
377        sb.append("</parameter>\r\n");
378        sb.append("\r\n");
379        Assert.assertEquals(sb.toString(), toXML(parameter));
380    }
381
382    /**
383     * Checks that a {@link MapPathParameter} instance is correctly encoded.
384     * @throws IOException if the test fails
385     */
386    @Test
387    public void testMapPathToXml1() throws IOException {
388        final File mapDir = new File("/tmp");
389        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new MapPathParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapDir);
390        parameter.setName("Name");
391        parameter.setDescription("Description");
392        final StringBuilder sb = new StringBuilder();
393        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
394        sb.append("<parameter>\r\n");
395        sb.append("  <name>Name</name>\r\n");
396        sb.append("  <description>Description</description>\r\n");
397        sb.append("  <type>MapPathParameter</type>\r\n");
398        sb.append("  <value />\r\n");
399        sb.append("</parameter>\r\n");
400        sb.append("\r\n");
401        Assert.assertEquals(sb.toString(), toXML(parameter));
402    }
403
404    /**
405     * Checks that a {@link MapPathParameter} instance is correctly encoded.
406     * @throws IOException if the test fails
407     */
408    @Test
409    public void testMapPathToXml2() throws IOException {
410        final File mapDir = new File("/tmp");
411        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new MapPathParameter<TestGameObject, TestMapArchObject, TestArchetype>(mapDir);
412        parameter.setStringValue("/path");
413        final StringBuilder sb = new StringBuilder();
414        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
415        sb.append("<parameter>\r\n");
416        sb.append("  <name>[name]</name>\r\n");
417        sb.append("  <description>[description]</description>\r\n");
418        sb.append("  <type>MapPathParameter</type>\r\n");
419        sb.append("  <value>/path</value>\r\n");
420        sb.append("</parameter>\r\n");
421        sb.append("\r\n");
422        Assert.assertEquals(sb.toString(), toXML(parameter));
423    }
424
425    /**
426     * Checks that a {@link StringParameter} instance is correctly encoded.
427     * @throws IOException if the test fails
428     */
429    @Test
430    public void testStringToXml1() throws IOException {
431        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new StringParameter<TestGameObject, TestMapArchObject, TestArchetype>();
432        parameter.setName("Name");
433        parameter.setDescription("Description");
434        final StringBuilder sb = new StringBuilder();
435        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
436        sb.append("<parameter>\r\n");
437        sb.append("  <name>Name</name>\r\n");
438        sb.append("  <description>Description</description>\r\n");
439        sb.append("  <type>java.lang.String</type>\r\n");
440        sb.append("  <value />\r\n");
441        sb.append("</parameter>\r\n");
442        sb.append("\r\n");
443        Assert.assertEquals(sb.toString(), toXML(parameter));
444    }
445
446    /**
447     * Checks that a {@link StringParameter} instance is correctly encoded.
448     * @throws IOException if the test fails
449     */
450    @Test
451    public void testStringToXml2() throws IOException {
452        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = new StringParameter<TestGameObject, TestMapArchObject, TestArchetype>();
453        parameter.setStringValue("string value");
454        final StringBuilder sb = new StringBuilder();
455        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
456        sb.append("<parameter>\r\n");
457        sb.append("  <name>[name]</name>\r\n");
458        sb.append("  <description>[description]</description>\r\n");
459        sb.append("  <type>java.lang.String</type>\r\n");
460        sb.append("  <value>string value</value>\r\n");
461        sb.append("</parameter>\r\n");
462        sb.append("\r\n");
463        Assert.assertEquals(sb.toString(), toXML(parameter));
464    }
465
466    /**
467     * Checks that a {@link ArchetypeParameter} is correctly decoded.
468     * @throws IOException if the test fails
469     * @throws JDOMException if the test fails
470     * @throws NoSuchParameterException if the test fails
471     */
472    @Test
473    public void testArchetypeFromXml1() throws IOException, JDOMException, NoSuchParameterException {
474        final StringBuilder sb = new StringBuilder();
475        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
476        sb.append("<parameter>\r\n");
477        sb.append("  <name>Name</name>\r\n");
478        sb.append("  <description>Description</description>\r\n");
479        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
480        sb.append("  <value/>\r\n");
481        sb.append("</parameter>\r\n");
482        sb.append("\r\n");
483        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
484        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
485        Assert.assertTrue(parameter instanceof ArchetypeParameter);
486        Assert.assertEquals("Name", parameter.getName());
487        Assert.assertEquals("net.sf.gridarta.model.archetype.Archetype", parameter.getParameterType());
488        Assert.assertEquals("Description", parameter.getDescription());
489        Assert.assertNull(parameter.getValue());
490        Assert.assertEquals("", parameter.getStringValue());
491    }
492
493    /**
494     * Checks that an {@link ArchetypeParameter} is correctly decoded.
495     * @throws IOException if the test fails
496     * @throws JDOMException if the test fails
497     * @throws NoSuchParameterException if the test fails
498     */
499    @Test
500    public void testArchetypeFromXml2() throws IOException, JDOMException, NoSuchParameterException {
501        final StringBuilder sb = new StringBuilder();
502        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
503        sb.append("<parameter>\r\n");
504        sb.append("  <name>Name</name>\r\n");
505        sb.append("  <description>Description</description>\r\n");
506        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
507        sb.append("  <value>undefined_archetype</value>\r\n");
508        sb.append("</parameter>\r\n");
509        sb.append("\r\n");
510        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
511        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
512        Assert.assertTrue(parameter instanceof ArchetypeParameter);
513        Assert.assertEquals("Name", parameter.getName());
514        Assert.assertEquals("net.sf.gridarta.model.archetype.Archetype", parameter.getParameterType());
515        Assert.assertEquals("Description", parameter.getDescription());
516        Assert.assertNull(parameter.getValue());
517        Assert.assertEquals("undefined_archetype", parameter.getStringValue());
518    }
519
520    /**
521     * Checks that an {@link ArchetypeParameter} is correctly decoded.
522     * @throws IOException if the test fails
523     * @throws JDOMException if the test fails
524     * @throws NoSuchParameterException if the test fails
525     */
526    @Test
527    public void testArchetypeFromXml3() throws IOException, JDOMException, NoSuchParameterException {
528        final StringBuilder sb = new StringBuilder();
529        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
530        sb.append("<parameter>\r\n");
531        sb.append("  <name>Name</name>\r\n");
532        sb.append("  <description>Description</description>\r\n");
533        sb.append("  <type>net.sf.gridarta.model.archetype.Archetype</type>\r\n");
534        sb.append("  <value>existing_archetype</value>\r\n");
535        sb.append("</parameter>\r\n");
536        sb.append("\r\n");
537        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
538        final TestArchetype archetype = mapControlCreator.getMapModelCreator().getArchetype("existing_archetype");
539        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
540        Assert.assertTrue(parameter instanceof ArchetypeParameter);
541        Assert.assertEquals("Name", parameter.getName());
542        Assert.assertEquals("net.sf.gridarta.model.archetype.Archetype", parameter.getParameterType());
543        Assert.assertEquals("Description", parameter.getDescription());
544        Assert.assertSame(archetype, parameter.getValue());
545        Assert.assertEquals("existing_archetype", parameter.getStringValue());
546    }
547
548    /**
549     * Checks that a {@link BooleanParameter} is correctly decoded.
550     * @throws IOException if the test fails
551     * @throws JDOMException if the test fails
552     * @throws NoSuchParameterException if the test fails
553     */
554    @Test
555    public void testBooleanFromXml1() throws IOException, JDOMException, NoSuchParameterException {
556        final StringBuilder sb = new StringBuilder();
557        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
558        sb.append("<parameter>\r\n");
559        sb.append("  <name>Name</name>\r\n");
560        sb.append("  <description>Description</description>\r\n");
561        sb.append("  <type>java.lang.Boolean</type>\r\n");
562        sb.append("  <value />\r\n");
563        sb.append("  <trueText>Yes</trueText>\r\n");
564        sb.append("  <falseText>No</falseText>\r\n");
565        sb.append("</parameter>\r\n");
566        sb.append("\r\n");
567        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
568        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
569        Assert.assertTrue(parameter instanceof BooleanParameter);
570        final BooleanParameter<?, ?, ?> booleanParameter = (BooleanParameter<?, ?, ?>) parameter;
571        Assert.assertEquals("Name", parameter.getName());
572        Assert.assertEquals("java.lang.Boolean", parameter.getParameterType());
573        Assert.assertEquals("Description", parameter.getDescription());
574        Assert.assertSame(Boolean.FALSE, parameter.getValue());
575        Assert.assertEquals("No", booleanParameter.getFalseText());
576        Assert.assertEquals("Yes", booleanParameter.getTrueText());
577    }
578
579    /**
580     * Checks that a {@link BooleanParameter} is correctly decoded.
581     * @throws IOException if the test fails
582     * @throws JDOMException if the test fails
583     * @throws NoSuchParameterException if the test fails
584     */
585    @Test
586    public void testBooleanFromXml2() throws IOException, JDOMException, NoSuchParameterException {
587        final StringBuilder sb = new StringBuilder();
588        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
589        sb.append("<parameter>\r\n");
590        sb.append("  <name>Name</name>\r\n");
591        sb.append("  <description>Description</description>\r\n");
592        sb.append("  <type>java.lang.Boolean</type>\r\n");
593        sb.append("  <value>true</value>\r\n");
594        sb.append("  <trueText>true-text</trueText>\r\n");
595        sb.append("  <falseText>false-text</falseText>\r\n");
596        sb.append("</parameter>\r\n");
597        sb.append("\r\n");
598        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
599        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
600        Assert.assertTrue(parameter instanceof BooleanParameter);
601        final BooleanParameter<?, ?, ?> booleanParameter = (BooleanParameter<?, ?, ?>) parameter;
602        Assert.assertEquals("Name", parameter.getName());
603        Assert.assertEquals("java.lang.Boolean", parameter.getParameterType());
604        Assert.assertEquals("Description", parameter.getDescription());
605        Assert.assertSame(Boolean.TRUE, parameter.getValue());
606        Assert.assertEquals("false-text", booleanParameter.getFalseText());
607        Assert.assertEquals("true-text", booleanParameter.getTrueText());
608    }
609
610    /**
611     * Checks that a {@link DoubleParameter} is correctly decoded.
612     * @throws IOException if the test fails
613     * @throws JDOMException if the test fails
614     * @throws NoSuchParameterException if the test fails
615     */
616    @Test
617    public void testDoubleFromXml1() throws IOException, JDOMException, NoSuchParameterException {
618        final StringBuilder sb = new StringBuilder();
619        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
620        sb.append("<parameter>\r\n");
621        sb.append("  <name>Name</name>\r\n");
622        sb.append("  <description>Description</description>\r\n");
623        sb.append("  <type>java.lang.Double</type>\r\n");
624        sb.append("  <value />\r\n");
625        sb.append("  <minimum>0.0</minimum>\r\n");
626        sb.append("  <maximum>1.0</maximum>\r\n");
627        sb.append("</parameter>\r\n");
628        sb.append("\r\n");
629        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
630        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
631        Assert.assertTrue(parameter instanceof DoubleParameter);
632        final DoubleParameter<?, ?, ?> doubleParameter = (DoubleParameter<?, ?, ?>) parameter;
633        Assert.assertEquals("Name", parameter.getName());
634        Assert.assertEquals("java.lang.Double", parameter.getParameterType());
635        Assert.assertEquals("Description", parameter.getDescription());
636        Assert.assertEquals(0.0, parameter.getValue());
637        Assert.assertEquals(0.0, doubleParameter.getMin());
638        Assert.assertEquals(1.0, doubleParameter.getMax());
639    }
640
641    /**
642     * Checks that a {@link DoubleParameter} is correctly decoded.
643     * @throws IOException if the test fails
644     * @throws JDOMException if the test fails
645     * @throws NoSuchParameterException if the test fails
646     */
647    @Test
648    public void testDoubleFromXml2() throws IOException, JDOMException, NoSuchParameterException {
649        final StringBuilder sb = new StringBuilder();
650        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
651        sb.append("<parameter>\r\n");
652        sb.append("  <name>Name</name>\r\n");
653        sb.append("  <description>Description</description>\r\n");
654        sb.append("  <type>java.lang.Double</type>\r\n");
655        sb.append("  <value>12.34</value>\r\n");
656        sb.append("  <minimum>-123.456</minimum>\r\n");
657        sb.append("  <maximum>234.0</maximum>\r\n");
658        sb.append("</parameter>\r\n");
659        sb.append("\r\n");
660        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
661        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
662        Assert.assertTrue(parameter instanceof DoubleParameter);
663        final DoubleParameter<?, ?, ?> doubleParameter = (DoubleParameter<?, ?, ?>) parameter;
664        Assert.assertEquals("Name", parameter.getName());
665        Assert.assertEquals("java.lang.Double", parameter.getParameterType());
666        Assert.assertEquals("Description", parameter.getDescription());
667        Assert.assertEquals(12.34, parameter.getValue());
668        Assert.assertEquals(-123.456, doubleParameter.getMin());
669        Assert.assertEquals(234.0, doubleParameter.getMax());
670    }
671
672    /**
673     * Checks that a {@link FilterParameter} is correctly decoded.
674     * @throws IOException if the test fails
675     * @throws JDOMException if the test fails
676     * @throws NoSuchParameterException if the test fails
677     */
678    @Ignore
679    @Test
680    public void testFilterFromXml1() throws IOException, JDOMException, NoSuchParameterException {
681        final StringBuilder sb = new StringBuilder();
682        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
683        sb.append("<parameter>\r\n");
684        sb.append("  <name>Name</name>\r\n");
685        sb.append("  <description>Description</description>\r\n");
686        sb.append("  <type>net.sf.gridarta.model.filter.NamedFilterConfig</type>\r\n");
687        sb.append("  <value>\r\n");
688        sb.append("    <enabled>false</enabled>\r\n");
689        sb.append("    <inverted>false</inverted>\r\n");
690        sb.append("  </value>\r\n");
691        sb.append("</parameter>\r\n");
692        sb.append("\r\n");
693        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
694        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
695        Assert.assertTrue(parameter instanceof FilterParameter);
696        //noinspection TypeMayBeWeakened
697        final FilterParameter<?, ?, ?> filterParameter = (FilterParameter<?, ?, ?>) parameter;
698        Assert.assertEquals("Name", parameter.getName());
699        Assert.assertEquals("net.sf.gridarta.model.filter.NamedFilterConfig", parameter.getParameterType());
700        Assert.assertEquals("Description", parameter.getDescription());
701        final NamedFilterConfig value = filterParameter.getValue();
702        Assert.assertNotNull(value);
703        Assert.assertFalse(value.isEnabled());
704        Assert.assertFalse(value.isInverted());
705    }
706
707    /**
708     * Checks that a {@link FilterParameter} is correctly decoded.
709     * @throws IOException if the test fails
710     * @throws JDOMException if the test fails
711     * @throws NoSuchParameterException if the test fails
712     */
713    @Ignore
714    @Test
715    public void testFilterFromXml2() throws IOException, JDOMException, NoSuchParameterException {
716        final StringBuilder sb = new StringBuilder();
717        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
718        sb.append("<parameter>\r\n");
719        sb.append("  <name>Name</name>\r\n");
720        sb.append("  <description>Description</description>\r\n");
721        sb.append("  <type>net.sf.gridarta.model.filter.NamedFilterConfig</type>\r\n");
722        sb.append("  <value>\r\n");
723        sb.append("    <enabled>true</enabled>\r\n");
724        sb.append("    <inverted>true</inverted>\r\n");
725        sb.append("  </value>\r\n");
726        sb.append("</parameter>\r\n");
727        sb.append("\r\n");
728        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
729        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
730        Assert.assertTrue(parameter instanceof FilterParameter);
731        //noinspection TypeMayBeWeakened
732        final FilterParameter<?, ?, ?> filterParameter = (FilterParameter<?, ?, ?>) parameter;
733        Assert.assertEquals("Name", parameter.getName());
734        Assert.assertEquals("net.sf.gridarta.model.filter.NamedFilterConfig", parameter.getParameterType());
735        Assert.assertEquals("Description", parameter.getDescription());
736        final NamedFilterConfig value = filterParameter.getValue();
737        Assert.assertNotNull(value);
738        Assert.assertTrue(value.isEnabled());
739        Assert.assertTrue(value.isInverted());
740    }
741
742    /**
743     * Checks that an {@link IntegerParameter} is correctly decoded.
744     * @throws IOException if the test fails
745     * @throws JDOMException if the test fails
746     * @throws NoSuchParameterException if the test fails
747     */
748    @Test
749    public void testIntegerFromXml1() throws IOException, JDOMException, NoSuchParameterException {
750        final StringBuilder sb = new StringBuilder();
751        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
752        sb.append("<parameter>\r\n");
753        sb.append("  <name>Name</name>\r\n");
754        sb.append("  <description>Description</description>\r\n");
755        sb.append("  <type>java.lang.Integer</type>\r\n");
756        sb.append("  <value />\r\n");
757        sb.append("  <minimum>-2147483648</minimum>\r\n");
758        sb.append("  <maximum>2147483647</maximum>\r\n");
759        sb.append("</parameter>\r\n");
760        sb.append("\r\n");
761        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
762        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
763        Assert.assertTrue(parameter instanceof IntegerParameter);
764        final IntegerParameter<?, ?, ?> integerParameter = (IntegerParameter<?, ?, ?>) parameter;
765        Assert.assertEquals("Name", parameter.getName());
766        Assert.assertEquals("java.lang.Integer", parameter.getParameterType());
767        Assert.assertEquals("Description", parameter.getDescription());
768        Assert.assertEquals(0, parameter.getValue());
769        Assert.assertEquals(-2147483648, integerParameter.getMin());
770        Assert.assertEquals(2147483647, integerParameter.getMax());
771    }
772
773    /**
774     * Checks that an {@link IntegerParameter} is correctly decoded.
775     * @throws IOException if the test fails
776     * @throws JDOMException if the test fails
777     * @throws NoSuchParameterException if the test fails
778     */
779    @Test
780    public void testIntegerFromXml2() throws IOException, JDOMException, NoSuchParameterException {
781        final StringBuilder sb = new StringBuilder();
782        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
783        sb.append("<parameter>\r\n");
784        sb.append("  <name>Name</name>\r\n");
785        sb.append("  <description>Description</description>\r\n");
786        sb.append("  <type>java.lang.Integer</type>\r\n");
787        sb.append("  <value>2</value>\r\n");
788        sb.append("  <minimum>-123</minimum>\r\n");
789        sb.append("  <maximum>234</maximum>\r\n");
790        sb.append("</parameter>\r\n");
791        sb.append("\r\n");
792        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
793        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
794        Assert.assertTrue(parameter instanceof IntegerParameter);
795        final IntegerParameter<?, ?, ?> integerParameter = (IntegerParameter<?, ?, ?>) parameter;
796        Assert.assertEquals("Name", parameter.getName());
797        Assert.assertEquals("java.lang.Integer", parameter.getParameterType());
798        Assert.assertEquals("Description", parameter.getDescription());
799        Assert.assertEquals(2, parameter.getValue());
800        Assert.assertEquals(-123, integerParameter.getMin());
801        Assert.assertEquals(234, integerParameter.getMax());
802    }
803
804    /**
805     * Checks that a {@link MapParameter} is correctly decoded.
806     * @throws IOException if the test fails
807     * @throws JDOMException if the test fails
808     * @throws NoSuchParameterException if the test fails
809     */
810    @Test
811    public void testMapFromXml1() throws IOException, JDOMException, NoSuchParameterException {
812        final StringBuilder sb = new StringBuilder();
813        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
814        sb.append("<parameter>\r\n");
815        sb.append("  <name>Name</name>\r\n");
816        sb.append("  <description>Description</description>\r\n");
817        sb.append("  <type>net.sf.gridarta.model.mapcontrol.MapControl</type>\r\n");
818        sb.append("  <value />\r\n");
819        sb.append("</parameter>\r\n");
820        sb.append("\r\n");
821        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
822        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
823        Assert.assertTrue(parameter instanceof MapParameter);
824        //final MapParameter<?, ?, ?> mapParameter = (MapParameter<?, ?, ?>) parameter;
825        Assert.assertEquals("Name", parameter.getName());
826        Assert.assertEquals("net.sf.gridarta.model.mapcontrol.MapControl", parameter.getParameterType());
827        Assert.assertEquals("Description", parameter.getDescription());
828        Assert.assertSame(mapControlCreator.getMapManager().getCurrentMap(), parameter.getValue());
829    }
830
831    /**
832     * Checks that a {@link MapParameter} is correctly decoded.
833     * @throws IOException if the test fails
834     * @throws JDOMException if the test fails
835     * @throws NoSuchParameterException if the test fails
836     */
837    @Ignore
838    @Test
839    public void testMapFromXml3() throws IOException, JDOMException, NoSuchParameterException {
840        final StringBuilder sb = new StringBuilder();
841        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
842        sb.append("<parameter>\r\n");
843        sb.append("  <name>Name</name>\r\n");
844        sb.append("  <description>Description</description>\r\n");
845        sb.append("  <type>net.sf.gridarta.model.mapcontrol.MapControl</type>\r\n");
846        sb.append("  <value>/path/to/map</value>\r\n");
847        sb.append("</parameter>\r\n");
848        sb.append("\r\n");
849        final TestMapControlCreator mapControlCreator = new TestMapControlCreator();
850        final File mapDir = new File("/tmp");
851        mapControlCreator.getMapManager().newMap(null, new TestMapArchObject(), new File(mapDir, "path/to/map"), false);
852        final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter = fromXML(mapControlCreator, sb.toString());
853        Assert.assertTrue(parameter instanceof MapParameter);
854        //noinspection TypeMayBeWeakened
855        final MapParameter<?, ?, ?> mapParameter = (MapParameter<?, ?, ?>) parameter;
856        Assert.assertEquals("Name", parameter.getName());
857        Assert.assertEquals("net.sf.gridarta.model.mapcontrol.MapControl", parameter.getParameterType());
858        Assert.assertEquals("Description", parameter.getDescription());
859        final MapControl<?, ?, ?> mapControl2 = mapParameter.getValue();
860        Assert.assertNotNull(mapControl2);
861        final File mapFile = mapControl2.getMapModel().getMapFile();
862        Assert.assertNotNull(mapFile);
863        Assert.assertTrue(mapFile.getPath().endsWith("/path/to/map"));
864    }
865
866    /**
867     * Encodes a {@link PluginParameter} to its string representation.
868     * @param parameter the plugin parameter
869     * @return the string representation
870     * @throws IOException if encoding fails
871     */
872    @NotNull
873    private static String toXML(@NotNull final PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> parameter) throws IOException {
874        final PluginParameterCodec<TestGameObject, TestMapArchObject, TestArchetype> codec = new PluginParameterCodec<TestGameObject, TestMapArchObject, TestArchetype>();
875        final Element element = codec.toXML(parameter);
876        final Document d = new Document(element);
877        final XMLOutputter out = new XMLOutputter();
878        out.setFormat(Format.getPrettyFormat());
879        final Writer writer = new StringWriter();
880        out.output(d, writer);
881        //noinspection ObjectToString
882        return writer.toString();
883    }
884
885    /**
886     * Decodes a {@link PluginParameter} from its string representation.
887     * @param mapControlCreator the map control creator to use
888     * @param string the string representation
889     * @return the plugin parameter
890     * @throws IOException if decoding fails
891     * @throws JDOMException if decoding fails
892     * @throws NoSuchParameterException if decoding fails
893     */
894    @NotNull
895    private static PluginParameter<TestGameObject, TestMapArchObject, TestArchetype, ?> fromXML(@NotNull final TestMapControlCreator mapControlCreator, @NotNull final String string) throws IOException, JDOMException, NoSuchParameterException {
896        final SAXBuilder builder = new SAXBuilder(false);
897        final Document document = builder.build(new StringReader(string));
898        final Iterable<NamedGameObjectMatcher> matchers = Collections.emptyList();
899        final NamedFilter filterList = new NamedFilter(matchers);
900        final PluginParameterFactory<TestGameObject, TestMapArchObject, TestArchetype> parameterFactory = new PluginParameterFactory<TestGameObject, TestMapArchObject, TestArchetype>(mapControlCreator.getArchetypeSet(), mapControlCreator.getMapManager(), filterList, mapControlCreator.getProjectSettings());
901        final Element element = document.getRootElement();
902        return parameterFactory.createParameter(element);
903    }
904
905}