001/*
002 *   Copyright (C) 2005 Christian Schulte <cs@schulte.it>
003 *   All rights reserved.
004 *
005 *   Redistribution and use in source and binary forms, with or without
006 *   modification, are permitted provided that the following conditions
007 *   are met:
008 *
009 *     o Redistributions of source code must retain the above copyright
010 *       notice, this list of conditions and the following disclaimer.
011 *
012 *     o Redistributions in binary form must reproduce the above copyright
013 *       notice, this list of conditions and the following disclaimer in
014 *       the documentation and/or other materials provided with the
015 *       distribution.
016 *
017 *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
018 *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
019 *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
020 *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
021 *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
022 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
023 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
024 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
026 *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027 *
028 *   $JOMC: ToolsModelProcessorTest.java 5135 2016-04-08 13:53:07Z schulte $
029 *
030 */
031package org.jomc.tools.modlet.test;
032
033import org.jomc.model.Implementation;
034import org.jomc.model.Implementations;
035import org.jomc.model.ModelObject;
036import org.jomc.model.Module;
037import org.jomc.model.Modules;
038import org.jomc.model.Specification;
039import org.jomc.model.Specifications;
040import org.jomc.model.modlet.ModelHelper;
041import org.jomc.modlet.Model;
042import org.jomc.modlet.ModelContext;
043import org.jomc.modlet.ModelContextFactory;
044import org.jomc.tools.model.SourceFileType;
045import org.jomc.tools.model.SourceFilesType;
046import org.jomc.tools.model.SourceSectionType;
047import org.jomc.tools.model.SourceSectionsType;
048import org.jomc.tools.modlet.ToolsModelProcessor;
049import org.junit.Test;
050import static org.junit.Assert.assertEquals;
051import static org.junit.Assert.assertFalse;
052import static org.junit.Assert.assertNotNull;
053import static org.junit.Assert.assertNull;
054import static org.junit.Assert.assertTrue;
055import static org.junit.Assert.fail;
056
057/**
058 * Test cases for class {@code org.jomc.tools.modlet.ToolsModelProcessor}.
059 *
060 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 1.0
061 * @version $JOMC: ToolsModelProcessorTest.java 5135 2016-04-08 13:53:07Z schulte $
062 */
063public class ToolsModelProcessorTest
064{
065
066    /**
067     * The {@code ToolsModelProcessor} instance tests are performed with.
068     */
069    private ToolsModelProcessor toolsModelProcessor;
070
071    /**
072     * Creates a new {@code ToolsModelProcessorTest} instance.
073     */
074    public ToolsModelProcessorTest()
075    {
076        super();
077    }
078
079    /**
080     * Gets the {@code ToolsModelProcessor} instance tests are performed with.
081     *
082     * @return The {@code ToolsModelProcessor} instance tests are performed with.
083     *
084     * @see #newModelProcessor()
085     */
086    public ToolsModelProcessor getModelProcessor()
087    {
088        if ( this.toolsModelProcessor == null )
089        {
090            this.toolsModelProcessor = this.newModelProcessor();
091        }
092
093        return this.toolsModelProcessor;
094    }
095
096    /**
097     * Creates a new {@code ToolsModelProcessor} instance to test.
098     *
099     * @return A new {@code ToolsModelProcessor} instance to test.
100     *
101     * @see #getModelProcessor()
102     */
103    protected ToolsModelProcessor newModelProcessor()
104    {
105        return new ToolsModelProcessor();
106    }
107
108    @Test
109    public final void testProcessModel() throws Exception
110    {
111        final ModelContext context = ModelContextFactory.newInstance().newModelContext();
112        Model model = new Model();
113        model.setIdentifier( ModelObject.MODEL_PUBLIC_ID );
114
115        Modules modules = new Modules();
116        Module module = new Module();
117        module.setName( this.getClass().getName() );
118        module.setSpecifications( new Specifications() );
119        module.setImplementations( new Implementations() );
120
121        Specification specification = new Specification();
122        specification.setClassDeclaration( true );
123        specification.setClazz( this.getClass().getName() );
124        specification.setIdentifier( this.getClass().getName() + " Specification" );
125
126        Implementation implementation = new Implementation();
127        implementation.setClassDeclaration( true );
128        implementation.setClazz( this.getClass().getName() );
129        implementation.setIdentifier( this.getClass().getName() + " Implementation" );
130        implementation.setName( this.getClass().getName() + " Implementation" );
131
132        module.getSpecifications().getSpecification().add( specification );
133        module.getImplementations().getImplementation().add( implementation );
134        modules.getModule().add( module );
135
136        ModelHelper.setModules( model, modules );
137
138        try
139        {
140            this.getModelProcessor().processModel( null, model );
141            fail( "Expected NullPointerException not thrown." );
142        }
143        catch ( final NullPointerException e )
144        {
145            assertNotNull( e.getMessage() );
146            System.out.println( e.toString() );
147        }
148
149        try
150        {
151            this.getModelProcessor().processModel( context, null );
152            fail( "Expected NullPointerException not thrown." );
153        }
154        catch ( final NullPointerException e )
155        {
156            assertNotNull( e.getMessage() );
157            System.out.println( e.toString() );
158        }
159
160        Model processed = this.getModelProcessor().processModel( context, model );
161        assertNotNull( processed );
162
163        modules = ModelHelper.getModules( processed );
164        assertNotNull( modules );
165
166        specification = modules.getSpecification( this.getClass().getName() + " Specification" );
167        assertNotNull( specification );
168
169        implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
170        assertNotNull( implementation );
171
172        SourceFileType ss = specification.getAnyObject( SourceFileType.class );
173        assertNull( ss );
174
175        SourceFileType is = implementation.getAnyObject( SourceFileType.class );
176        assertNull( is );
177
178        ss = new SourceFileType();
179        ss.setIdentifier( this.getClass().getName() + " Specification" );
180
181        is = new SourceFileType();
182        is.setIdentifier( this.getClass().getName() + " Implementation" );
183
184        specification.getAny().add( ss );
185        implementation.getAny().add( is );
186
187        processed = this.getModelProcessor().processModel( context, processed );
188        assertNotNull( processed );
189
190        modules = ModelHelper.getModules( processed );
191        assertNotNull( modules );
192
193        specification = modules.getSpecification( this.getClass().getName() + " Specification" );
194        assertNotNull( specification );
195
196        implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
197        assertNotNull( implementation );
198
199        ss = specification.getAnyObject( SourceFileType.class );
200        assertNotNull( ss );
201        assertNotNull( ss.getLocation() );
202        assertNotNull( ss.getHeadComment() );
203
204        is = implementation.getAnyObject( SourceFileType.class );
205        assertNotNull( is );
206        assertNotNull( is.getLocation() );
207        assertNotNull( is.getHeadComment() );
208
209        specification.getAny().clear();
210        implementation.getAny().clear();
211
212        SourceFilesType specificationSourceFiles = new SourceFilesType();
213        ss = new SourceFileType();
214        ss.setIdentifier( this.getClass().getSimpleName() );
215        ss.setSourceSections( new SourceSectionsType() );
216        specificationSourceFiles.getSourceFile().add( ss );
217        specification.getAny().add( specificationSourceFiles );
218
219        SourceFilesType implementationSourceFiles = new SourceFilesType();
220        is = new SourceFileType();
221        is.setIdentifier( this.getClass().getSimpleName() );
222        is.setSourceSections( new SourceSectionsType() );
223        implementationSourceFiles.getSourceFile().add( is );
224        implementation.getAny().add( implementationSourceFiles );
225
226        SourceSectionType sourceSection = new SourceSectionType();
227        sourceSection.setName( "License Header" );
228
229        ss.getSourceSections().getSourceSection().add( sourceSection );
230        is.getSourceSections().getSourceSection().add( sourceSection );
231
232        sourceSection = new SourceSectionType();
233        sourceSection.setName( "Annotations" );
234
235        ss.getSourceSections().getSourceSection().add( sourceSection );
236        is.getSourceSections().getSourceSection().add( sourceSection );
237
238        sourceSection = new SourceSectionType();
239        sourceSection.setName( "Documentation" );
240
241        ss.getSourceSections().getSourceSection().add( sourceSection );
242        is.getSourceSections().getSourceSection().add( sourceSection );
243
244        sourceSection = new SourceSectionType();
245        sourceSection.setName( this.getClass().getSimpleName() );
246
247        ss.getSourceSections().getSourceSection().add( sourceSection );
248        is.getSourceSections().getSourceSection().add( sourceSection );
249
250        sourceSection = new SourceSectionType();
251        sourceSection.setName( "Constructors" );
252
253        is.getSourceSections().getSourceSection().add( sourceSection );
254
255        sourceSection = new SourceSectionType();
256        sourceSection.setName( "Default Constructor" );
257
258        is.getSourceSections().getSourceSection().add( sourceSection );
259
260        sourceSection = new SourceSectionType();
261        sourceSection.setName( "Dependencies" );
262
263        is.getSourceSections().getSourceSection().add( sourceSection );
264
265        sourceSection = new SourceSectionType();
266        sourceSection.setName( "Properties" );
267
268        is.getSourceSections().getSourceSection().add( sourceSection );
269
270        sourceSection = new SourceSectionType();
271        sourceSection.setName( "Messages" );
272
273        is.getSourceSections().getSourceSection().add( sourceSection );
274
275        processed = this.getModelProcessor().processModel( context, processed );
276        assertNotNull( processed );
277
278        modules = ModelHelper.getModules( processed );
279        assertNotNull( modules );
280
281        specification = modules.getSpecification( this.getClass().getName() + " Specification" );
282        assertNotNull( specification );
283
284        implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
285        assertNotNull( implementation );
286
287        specificationSourceFiles = specification.getAnyObject( SourceFilesType.class );
288        assertNotNull( specificationSourceFiles );
289
290        ss = specificationSourceFiles.getSourceFile( this.getClass().getSimpleName() );
291        assertNotNull( ss );
292        assertNotNull( ss.getHeadComment() );
293        assertNotNull( ss.getLocation() );
294        assertNotNull( ss.getTemplate() );
295
296        implementationSourceFiles = implementation.getAnyObject( SourceFilesType.class );
297        assertNotNull( implementationSourceFiles );
298        is = implementationSourceFiles.getSourceFile( this.getClass().getSimpleName() );
299        assertNotNull( is );
300        assertNotNull( is.getHeadComment() );
301        assertNotNull( is.getLocation() );
302        assertNotNull( is.getTemplate() );
303
304        sourceSection = ss.getSourceSections().getSourceSection( "License Header" );
305        assertNotNull( sourceSection );
306        assertTrue( sourceSection.isOptional() );
307        assertNotNull( sourceSection.getHeadTemplate() );
308
309        sourceSection = is.getSourceSections().getSourceSection( "License Header" );
310        assertNotNull( sourceSection );
311        assertTrue( sourceSection.isOptional() );
312        assertNotNull( sourceSection.getHeadTemplate() );
313
314        sourceSection = ss.getSourceSections().getSourceSection( "Annotations" );
315        assertNotNull( sourceSection );
316        assertNotNull( sourceSection.getHeadTemplate() );
317
318        sourceSection = is.getSourceSections().getSourceSection( "Annotations" );
319        assertNotNull( sourceSection );
320        assertNotNull( sourceSection.getHeadTemplate() );
321
322        sourceSection = ss.getSourceSections().getSourceSection( "Documentation" );
323        assertNotNull( sourceSection );
324        assertTrue( sourceSection.isOptional() );
325        assertNotNull( sourceSection.getHeadTemplate() );
326
327        sourceSection = is.getSourceSections().getSourceSection( "Documentation" );
328        assertNotNull( sourceSection );
329        assertTrue( sourceSection.isOptional() );
330        assertNotNull( sourceSection.getHeadTemplate() );
331
332        sourceSection = ss.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
333        assertNotNull( sourceSection );
334        assertTrue( sourceSection.isEditable() );
335        assertEquals( 1, sourceSection.getIndentationLevel() );
336
337        sourceSection = is.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
338        assertNotNull( sourceSection );
339        assertTrue( sourceSection.isEditable() );
340        assertEquals( 1, sourceSection.getIndentationLevel() );
341
342        sourceSection = is.getSourceSections().getSourceSection( "Constructors" );
343        assertNotNull( sourceSection );
344        assertNotNull( sourceSection.getHeadTemplate() );
345        assertNotNull( sourceSection.getTailTemplate() );
346        assertEquals( 1, sourceSection.getIndentationLevel() );
347        assertTrue( sourceSection.isOptional() );
348
349        sourceSection = is.getSourceSections().getSourceSection( "Default Constructor" );
350        assertNotNull( sourceSection );
351        assertNotNull( sourceSection.getHeadTemplate() );
352        assertEquals( 2, sourceSection.getIndentationLevel() );
353        assertTrue( sourceSection.isEditable() );
354
355        sourceSection = is.getSourceSections().getSourceSection( "Dependencies" );
356        assertNotNull( sourceSection );
357        assertNotNull( sourceSection.getHeadTemplate() );
358        assertEquals( 1, sourceSection.getIndentationLevel() );
359        assertTrue( sourceSection.isOptional() );
360
361        sourceSection = is.getSourceSections().getSourceSection( "Properties" );
362        assertNotNull( sourceSection );
363        assertNotNull( sourceSection.getHeadTemplate() );
364        assertEquals( 1, sourceSection.getIndentationLevel() );
365        assertTrue( sourceSection.isOptional() );
366
367        sourceSection = is.getSourceSections().getSourceSection( "Messages" );
368        assertNotNull( sourceSection );
369        assertNotNull( sourceSection.getHeadTemplate() );
370        assertEquals( 1, sourceSection.getIndentationLevel() );
371        assertTrue( sourceSection.isOptional() );
372
373        sourceSection = is.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
374        assertNotNull( sourceSection );
375        assertEquals( 1, sourceSection.getIndentationLevel() );
376        assertTrue( sourceSection.isEditable() );
377    }
378
379    @Test
380    public final void testDefaultEnabled() throws Exception
381    {
382        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
383        ToolsModelProcessor.setDefaultEnabled( null );
384        assertTrue( ToolsModelProcessor.isDefaultEnabled() );
385
386        System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled", Boolean.toString( false ) );
387        ToolsModelProcessor.setDefaultEnabled( null );
388        assertFalse( ToolsModelProcessor.isDefaultEnabled() );
389        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
390        ToolsModelProcessor.setDefaultEnabled( null );
391        assertTrue( ToolsModelProcessor.isDefaultEnabled() );
392
393        System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled", Boolean.toString( true ) );
394        ToolsModelProcessor.setDefaultEnabled( null );
395        assertTrue( ToolsModelProcessor.isDefaultEnabled() );
396        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
397        ToolsModelProcessor.setDefaultEnabled( null );
398        assertTrue( ToolsModelProcessor.isDefaultEnabled() );
399    }
400
401    @Test
402    public final void testEnabled() throws Exception
403    {
404        final Model model = new Model();
405        model.setIdentifier( ModelObject.MODEL_PUBLIC_ID );
406
407        ToolsModelProcessor.setDefaultEnabled( null );
408        this.getModelProcessor().setEnabled( null );
409        assertTrue( this.getModelProcessor().isEnabled() );
410
411        this.getModelProcessor().processModel( ModelContextFactory.newInstance().newModelContext(), model );
412        ToolsModelProcessor.setDefaultEnabled( false );
413        this.getModelProcessor().setEnabled( null );
414        assertFalse( this.getModelProcessor().isEnabled() );
415
416        this.getModelProcessor().processModel( ModelContextFactory.newInstance().newModelContext(), model );
417        ToolsModelProcessor.setDefaultEnabled( null );
418        this.getModelProcessor().setEnabled( null );
419    }
420
421    @Test
422    public final void testDefaultHeadComment() throws Exception
423    {
424        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultHeadComment" );
425        ToolsModelProcessor.setDefaultHeadComment( null );
426        assertEquals( "//", ToolsModelProcessor.getDefaultHeadComment() );
427
428        System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultHeadComment", "/*" );
429        ToolsModelProcessor.setDefaultHeadComment( null );
430        assertEquals( "/*", ToolsModelProcessor.getDefaultHeadComment() );
431        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultHeadComment" );
432        ToolsModelProcessor.setDefaultHeadComment( null );
433        assertEquals( "//", ToolsModelProcessor.getDefaultHeadComment() );
434    }
435
436    @Test
437    public final void testHeadComment() throws Exception
438    {
439        ToolsModelProcessor.setDefaultHeadComment( null );
440        this.getModelProcessor().setHeadComment( null );
441        assertEquals( "//", this.getModelProcessor().getHeadComment() );
442
443        ToolsModelProcessor.setDefaultHeadComment( "/*" );
444        this.getModelProcessor().setHeadComment( null );
445        assertEquals( "/*", this.getModelProcessor().getHeadComment() );
446
447        ToolsModelProcessor.setDefaultHeadComment( null );
448        this.getModelProcessor().setHeadComment( null );
449        assertEquals( "//", this.getModelProcessor().getHeadComment() );
450    }
451
452    @Test
453    public final void testDefaultTailComment() throws Exception
454    {
455        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultTailComment" );
456        ToolsModelProcessor.setDefaultTailComment( null );
457        assertNull( ToolsModelProcessor.getDefaultTailComment() );
458
459        System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultTailComment", "*/" );
460        ToolsModelProcessor.setDefaultTailComment( null );
461        assertEquals( "*/", ToolsModelProcessor.getDefaultTailComment() );
462
463        System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultTailComment" );
464        ToolsModelProcessor.setDefaultTailComment( null );
465        assertNull( ToolsModelProcessor.getDefaultTailComment() );
466    }
467
468    @Test
469    public final void testTailComment() throws Exception
470    {
471        ToolsModelProcessor.setDefaultTailComment( null );
472        this.getModelProcessor().setTailComment( null );
473        assertNull( this.getModelProcessor().getTailComment() );
474
475        ToolsModelProcessor.setDefaultTailComment( "*/" );
476        this.getModelProcessor().setTailComment( null );
477        assertEquals( "*/", this.getModelProcessor().getTailComment() );
478
479        ToolsModelProcessor.setDefaultTailComment( null );
480        this.getModelProcessor().setTailComment( null );
481        assertNull( this.getModelProcessor().getTailComment() );
482    }
483
484}