001    /*
002     *   Copyright (C) Christian Schulte, 2005-206
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 4200 2012-01-25 09:46:13Z schulte2005 $
029     *
030     */
031    package org.jomc.tools.modlet.test;
032    
033    import org.jomc.model.Implementation;
034    import org.jomc.model.Implementations;
035    import org.jomc.model.ModelObject;
036    import org.jomc.model.Module;
037    import org.jomc.model.Modules;
038    import org.jomc.model.Specification;
039    import org.jomc.model.Specifications;
040    import org.jomc.model.modlet.ModelHelper;
041    import org.jomc.modlet.Model;
042    import org.jomc.modlet.ModelContext;
043    import org.jomc.modlet.ModelContextFactory;
044    import org.jomc.tools.model.SourceFileType;
045    import org.jomc.tools.model.SourceFilesType;
046    import org.jomc.tools.model.SourceSectionType;
047    import org.jomc.tools.model.SourceSectionsType;
048    import org.jomc.tools.modlet.ToolsModelProcessor;
049    import org.junit.Test;
050    import static org.junit.Assert.assertEquals;
051    import static org.junit.Assert.assertFalse;
052    import static org.junit.Assert.assertNotNull;
053    import static org.junit.Assert.assertNull;
054    import static org.junit.Assert.assertTrue;
055    import static org.junit.Assert.fail;
056    
057    /**
058     * Test cases for class {@code org.jomc.tools.modlet.ToolsModelProcessor}.
059     *
060     * @author <a href="mailto:schulte2005@users.sourceforge.net">Christian Schulte</a> 1.0
061     * @version $JOMC: ToolsModelProcessorTest.java 4200 2012-01-25 09:46:13Z schulte2005 $
062     */
063    public class ToolsModelProcessorTest
064    {
065    
066        /** The {@code ToolsModelProcessor} instance tests are performed with. */
067        private ToolsModelProcessor toolsModelProcessor;
068    
069        /** Creates a new {@code ToolsModelProcessorTest} instance. */
070        public ToolsModelProcessorTest()
071        {
072            super();
073        }
074    
075        /**
076         * Gets the {@code ToolsModelProcessor} instance tests are performed with.
077         *
078         * @return The {@code ToolsModelProcessor} instance tests are performed with.
079         *
080         * @see #newModelProcessor()
081         */
082        public ToolsModelProcessor getModelProcessor()
083        {
084            if ( this.toolsModelProcessor == null )
085            {
086                this.toolsModelProcessor = this.newModelProcessor();
087            }
088    
089            return this.toolsModelProcessor;
090        }
091    
092        /**
093         * Creates a new {@code ToolsModelProcessor} instance to test.
094         *
095         * @return A new {@code ToolsModelProcessor} instance to test.
096         *
097         * @see #getModelProcessor()
098         */
099        protected ToolsModelProcessor newModelProcessor()
100        {
101            return new ToolsModelProcessor();
102        }
103    
104        @Test
105        public final void testProcessModel() throws Exception
106        {
107            final ModelContext context = ModelContextFactory.newInstance().newModelContext();
108            Model model = new Model();
109            model.setIdentifier( ModelObject.MODEL_PUBLIC_ID );
110    
111            Modules modules = new Modules();
112            Module module = new Module();
113            module.setName( this.getClass().getName() );
114            module.setSpecifications( new Specifications() );
115            module.setImplementations( new Implementations() );
116    
117            Specification specification = new Specification();
118            specification.setClassDeclaration( true );
119            specification.setClazz( this.getClass().getName() );
120            specification.setIdentifier( this.getClass().getName() + " Specification" );
121    
122            Implementation implementation = new Implementation();
123            implementation.setClassDeclaration( true );
124            implementation.setClazz( this.getClass().getName() );
125            implementation.setIdentifier( this.getClass().getName() + " Implementation" );
126            implementation.setName( this.getClass().getName() + " Implementation" );
127    
128            module.getSpecifications().getSpecification().add( specification );
129            module.getImplementations().getImplementation().add( implementation );
130            modules.getModule().add( module );
131    
132            ModelHelper.setModules( model, modules );
133    
134            try
135            {
136                this.getModelProcessor().processModel( null, model );
137                fail( "Expected NullPointerException not thrown." );
138            }
139            catch ( final NullPointerException e )
140            {
141                assertNotNull( e.getMessage() );
142                System.out.println( e.toString() );
143            }
144    
145            try
146            {
147                this.getModelProcessor().processModel( context, null );
148                fail( "Expected NullPointerException not thrown." );
149            }
150            catch ( final NullPointerException e )
151            {
152                assertNotNull( e.getMessage() );
153                System.out.println( e.toString() );
154            }
155    
156            Model processed = this.getModelProcessor().processModel( context, model );
157            assertNotNull( processed );
158    
159            modules = ModelHelper.getModules( processed );
160            assertNotNull( modules );
161    
162            specification = modules.getSpecification( this.getClass().getName() + " Specification" );
163            assertNotNull( specification );
164    
165            implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
166            assertNotNull( implementation );
167    
168            SourceFileType ss = specification.getAnyObject( SourceFileType.class );
169            assertNull( ss );
170    
171            SourceFileType is = implementation.getAnyObject( SourceFileType.class );
172            assertNull( is );
173    
174            ss = new SourceFileType();
175            ss.setIdentifier( this.getClass().getName() + " Specification" );
176    
177            is = new SourceFileType();
178            is.setIdentifier( this.getClass().getName() + " Implementation" );
179    
180            specification.getAny().add( ss );
181            implementation.getAny().add( is );
182    
183            processed = this.getModelProcessor().processModel( context, processed );
184            assertNotNull( processed );
185    
186            modules = ModelHelper.getModules( processed );
187            assertNotNull( modules );
188    
189            specification = modules.getSpecification( this.getClass().getName() + " Specification" );
190            assertNotNull( specification );
191    
192            implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
193            assertNotNull( implementation );
194    
195            ss = specification.getAnyObject( SourceFileType.class );
196            assertNotNull( ss );
197            assertNotNull( ss.getLocation() );
198            assertNotNull( ss.getHeadComment() );
199    
200            is = implementation.getAnyObject( SourceFileType.class );
201            assertNotNull( is );
202            assertNotNull( is.getLocation() );
203            assertNotNull( is.getHeadComment() );
204    
205            specification.getAny().clear();
206            implementation.getAny().clear();
207    
208            SourceFilesType specificationSourceFiles = new SourceFilesType();
209            ss = new SourceFileType();
210            ss.setIdentifier( this.getClass().getSimpleName() );
211            ss.setSourceSections( new SourceSectionsType() );
212            specificationSourceFiles.getSourceFile().add( ss );
213            specification.getAny().add( specificationSourceFiles );
214    
215            SourceFilesType implementationSourceFiles = new SourceFilesType();
216            is = new SourceFileType();
217            is.setIdentifier( this.getClass().getSimpleName() );
218            is.setSourceSections( new SourceSectionsType() );
219            implementationSourceFiles.getSourceFile().add( is );
220            implementation.getAny().add( implementationSourceFiles );
221    
222            SourceSectionType sourceSection = new SourceSectionType();
223            sourceSection.setName( "License Header" );
224    
225            ss.getSourceSections().getSourceSection().add( sourceSection );
226            is.getSourceSections().getSourceSection().add( sourceSection );
227    
228            sourceSection = new SourceSectionType();
229            sourceSection.setName( "Annotations" );
230    
231            ss.getSourceSections().getSourceSection().add( sourceSection );
232            is.getSourceSections().getSourceSection().add( sourceSection );
233    
234            sourceSection = new SourceSectionType();
235            sourceSection.setName( "Documentation" );
236    
237            ss.getSourceSections().getSourceSection().add( sourceSection );
238            is.getSourceSections().getSourceSection().add( sourceSection );
239    
240            sourceSection = new SourceSectionType();
241            sourceSection.setName( this.getClass().getSimpleName() );
242    
243            ss.getSourceSections().getSourceSection().add( sourceSection );
244            is.getSourceSections().getSourceSection().add( sourceSection );
245    
246            sourceSection = new SourceSectionType();
247            sourceSection.setName( "Constructors" );
248    
249            is.getSourceSections().getSourceSection().add( sourceSection );
250    
251            sourceSection = new SourceSectionType();
252            sourceSection.setName( "Default Constructor" );
253    
254            is.getSourceSections().getSourceSection().add( sourceSection );
255    
256            sourceSection = new SourceSectionType();
257            sourceSection.setName( "Dependencies" );
258    
259            is.getSourceSections().getSourceSection().add( sourceSection );
260    
261            sourceSection = new SourceSectionType();
262            sourceSection.setName( "Properties" );
263    
264            is.getSourceSections().getSourceSection().add( sourceSection );
265    
266            sourceSection = new SourceSectionType();
267            sourceSection.setName( "Messages" );
268    
269            is.getSourceSections().getSourceSection().add( sourceSection );
270    
271            processed = this.getModelProcessor().processModel( context, processed );
272            assertNotNull( processed );
273    
274            modules = ModelHelper.getModules( processed );
275            assertNotNull( modules );
276    
277            specification = modules.getSpecification( this.getClass().getName() + " Specification" );
278            assertNotNull( specification );
279    
280            implementation = modules.getImplementation( this.getClass().getName() + " Implementation" );
281            assertNotNull( implementation );
282    
283            specificationSourceFiles = specification.getAnyObject( SourceFilesType.class );
284            assertNotNull( specificationSourceFiles );
285    
286            ss = specificationSourceFiles.getSourceFile( this.getClass().getSimpleName() );
287            assertNotNull( ss );
288            assertNotNull( ss.getHeadComment() );
289            assertNotNull( ss.getLocation() );
290            assertNotNull( ss.getTemplate() );
291    
292            implementationSourceFiles = implementation.getAnyObject( SourceFilesType.class );
293            assertNotNull( implementationSourceFiles );
294            is = implementationSourceFiles.getSourceFile( this.getClass().getSimpleName() );
295            assertNotNull( is );
296            assertNotNull( is.getHeadComment() );
297            assertNotNull( is.getLocation() );
298            assertNotNull( is.getTemplate() );
299    
300            sourceSection = ss.getSourceSections().getSourceSection( "License Header" );
301            assertNotNull( sourceSection );
302            assertTrue( sourceSection.isOptional() );
303            assertNotNull( sourceSection.getHeadTemplate() );
304    
305            sourceSection = is.getSourceSections().getSourceSection( "License Header" );
306            assertNotNull( sourceSection );
307            assertTrue( sourceSection.isOptional() );
308            assertNotNull( sourceSection.getHeadTemplate() );
309    
310            sourceSection = ss.getSourceSections().getSourceSection( "Annotations" );
311            assertNotNull( sourceSection );
312            assertNotNull( sourceSection.getHeadTemplate() );
313    
314            sourceSection = is.getSourceSections().getSourceSection( "Annotations" );
315            assertNotNull( sourceSection );
316            assertNotNull( sourceSection.getHeadTemplate() );
317    
318            sourceSection = ss.getSourceSections().getSourceSection( "Documentation" );
319            assertNotNull( sourceSection );
320            assertTrue( sourceSection.isOptional() );
321            assertNotNull( sourceSection.getHeadTemplate() );
322    
323            sourceSection = is.getSourceSections().getSourceSection( "Documentation" );
324            assertNotNull( sourceSection );
325            assertTrue( sourceSection.isOptional() );
326            assertNotNull( sourceSection.getHeadTemplate() );
327    
328            sourceSection = ss.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
329            assertNotNull( sourceSection );
330            assertTrue( sourceSection.isEditable() );
331            assertEquals( 1, sourceSection.getIndentationLevel() );
332    
333            sourceSection = is.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
334            assertNotNull( sourceSection );
335            assertTrue( sourceSection.isEditable() );
336            assertEquals( 1, sourceSection.getIndentationLevel() );
337    
338            sourceSection = is.getSourceSections().getSourceSection( "Constructors" );
339            assertNotNull( sourceSection );
340            assertNotNull( sourceSection.getHeadTemplate() );
341            assertNotNull( sourceSection.getTailTemplate() );
342            assertEquals( 1, sourceSection.getIndentationLevel() );
343            assertTrue( sourceSection.isOptional() );
344    
345            sourceSection = is.getSourceSections().getSourceSection( "Default Constructor" );
346            assertNotNull( sourceSection );
347            assertNotNull( sourceSection.getHeadTemplate() );
348            assertEquals( 2, sourceSection.getIndentationLevel() );
349            assertTrue( sourceSection.isEditable() );
350    
351            sourceSection = is.getSourceSections().getSourceSection( "Dependencies" );
352            assertNotNull( sourceSection );
353            assertNotNull( sourceSection.getHeadTemplate() );
354            assertEquals( 1, sourceSection.getIndentationLevel() );
355            assertTrue( sourceSection.isOptional() );
356    
357            sourceSection = is.getSourceSections().getSourceSection( "Properties" );
358            assertNotNull( sourceSection );
359            assertNotNull( sourceSection.getHeadTemplate() );
360            assertEquals( 1, sourceSection.getIndentationLevel() );
361            assertTrue( sourceSection.isOptional() );
362    
363            sourceSection = is.getSourceSections().getSourceSection( "Messages" );
364            assertNotNull( sourceSection );
365            assertNotNull( sourceSection.getHeadTemplate() );
366            assertEquals( 1, sourceSection.getIndentationLevel() );
367            assertTrue( sourceSection.isOptional() );
368    
369            sourceSection = is.getSourceSections().getSourceSection( this.getClass().getSimpleName() );
370            assertNotNull( sourceSection );
371            assertEquals( 1, sourceSection.getIndentationLevel() );
372            assertTrue( sourceSection.isEditable() );
373        }
374    
375        @Test
376        public final void testDefaultEnabled() throws Exception
377        {
378            System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
379            ToolsModelProcessor.setDefaultEnabled( null );
380            assertTrue( ToolsModelProcessor.isDefaultEnabled() );
381    
382            System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled", Boolean.toString( false ) );
383            ToolsModelProcessor.setDefaultEnabled( null );
384            assertFalse( ToolsModelProcessor.isDefaultEnabled() );
385            System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
386            ToolsModelProcessor.setDefaultEnabled( null );
387            assertTrue( ToolsModelProcessor.isDefaultEnabled() );
388    
389            System.setProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled", Boolean.toString( true ) );
390            ToolsModelProcessor.setDefaultEnabled( null );
391            assertTrue( ToolsModelProcessor.isDefaultEnabled() );
392            System.clearProperty( "org.jomc.tools.modlet.ToolsModelProcessor.defaultEnabled" );
393            ToolsModelProcessor.setDefaultEnabled( null );
394            assertTrue( ToolsModelProcessor.isDefaultEnabled() );
395        }
396    
397        @Test
398        public final void testEnabled() throws Exception
399        {
400            final Model model = new Model();
401            model.setIdentifier( ModelObject.MODEL_PUBLIC_ID );
402    
403            ToolsModelProcessor.setDefaultEnabled( null );
404            this.getModelProcessor().setEnabled( null );
405            assertTrue( this.getModelProcessor().isEnabled() );
406    
407            this.getModelProcessor().processModel( ModelContextFactory.newInstance().newModelContext(), model );
408            ToolsModelProcessor.setDefaultEnabled( false );
409            this.getModelProcessor().setEnabled( null );
410            assertFalse( this.getModelProcessor().isEnabled() );
411    
412            this.getModelProcessor().processModel( ModelContextFactory.newInstance().newModelContext(), model );
413            ToolsModelProcessor.setDefaultEnabled( null );
414            this.getModelProcessor().setEnabled( null );
415        }
416    
417    }