[Title] Added 'copy' and 'templating' logic, Added UNIT TEST code
authorgyeongseok.seo <gyeongseok.seo@samsung.com>
Tue, 14 May 2013 11:03:00 +0000 (20:03 +0900)
committergyeongseok.seo <gyeongseok.seo@samsung.com>
Tue, 14 May 2013 11:03:00 +0000 (20:03 +0900)
[Desc.]
[Issue]

Change-Id: I49432f6612ac82055fdd75b54b8d3b9761546b6d

org.tizen.common.verrari.realm/src/org/tizen/common/verrari/template/DirectoryTemplate.java
org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/DirectoryTemplateTest.java
org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/web-ui-fw/0.1.1/META-INF/MANIFEST.MF
org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/web-ui-fw/0.1.1/META-INF/messages.properties
org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/web-ui-fw/0.1.1/config.xml [new file with mode: 0644]

index fd232ad..cb90550 100644 (file)
@@ -28,6 +28,7 @@ package org.tizen.common.verrari.template;
 import static org.tizen.common.util.ArrayUtil.pickupFirst;
 import static org.tizen.common.util.IOUtil.getBytes;
 import static org.tizen.common.util.IOUtil.tryClose;
+import static org.tizen.common.util.StringUtil.nvl;
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_COPY;
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_EXCLUDE;
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_INCLUDE;
@@ -41,11 +42,14 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.Locale;
 import java.util.PropertyResourceBundle;
 import java.util.ResourceBundle;
 
+import org.tizen.common.core.command.ExecutionContext;
 import org.tizen.common.file.Filter;
+import org.tizen.common.util.IOUtil;
 import org.tizen.common.util.StringUtil;
 import org.tizen.common.verrari.IModelProvider;
 import org.tizen.common.verrari.ITemplateEngine;
@@ -348,11 +352,63 @@ extends CommonTemplate
 
         try {
             pretemplate( models );
-        } catch (IOException e) {
+            
+            // copy
+            for ( final String name : this.copyNames )
+            {
+                logger.trace( "Copy[{}] start", name );
+                final String target = nvl( this.mapper.map( name ), name );
+
+                InputStream in = null;
+                OutputStream out = null;
+                
+                try
+                {
+                    in = engine.getTemplateProvider().getTemplate( name ).open();
+                    out = storage.getTarget( target );
+                    ExecutionContext.getCurrentContext().getPrompter().notify( target + " created" );
+                    IOUtil.redirect( in , out );
+                    
+                }
+                finally
+                {
+                    tryClose( in, out );
+                }
+            }
+            
+            // templating
+            for ( final String name : this.templateNames )
+            {
+                logger.trace( "Template[{}] start", name );
+                final String target = nvl( this.mapper.map( name ), name );
+
+                final OutputStream out = storage.getTarget( target );
+
+                try
+                {
+                    engine.generate( name, models, out );
+                    ExecutionContext.getCurrentContext().getPrompter().notify( target + " created" );
+                }
+                finally
+                {
+                    tryClose( out );
+                }
+            }
+            
+        }
+        catch ( final IOException e )
+        {
             throw new TemplateException( e );
         }
-
-        logger.info( "End template process..." );
-        System.out.println("End template process..." );
+        catch ( final Exception e )
+        {
+            throw new TemplateException( e );
+        }
+        finally
+        {
+            context.remove();
+            logger.info( "End template process..." );
+            System.out.println("End template process..." );
+        }
     }
 }
index 202f947..96120b8 100644 (file)
@@ -28,11 +28,15 @@ package org.tizen.common.verrari.template;
 import static org.junit.Assert.*;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -51,6 +55,7 @@ import org.tizen.common.core.command.prompter.NopPrompter;
 import org.tizen.common.file.VirtualFileHandler;
 import org.tizen.common.verrari.AbstractTestCase;
 import org.tizen.common.verrari.IModelProvider;
+import org.tizen.common.verrari.Storage;
 
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_NAME;
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_MAPPING;
@@ -59,6 +64,7 @@ import static org.tizen.common.verrari.template.TemplateConstants.ATTR_COPY;
 import static org.tizen.common.verrari.template.TemplateConstants.ATTR_EXCLUDE;
 
 import static org.tizen.common.util.IOUtil.tryClose;
+import static org.tizen.common.util.IOUtil.getBytes;
 import static org.tizen.common.util.ObjectUtil.nvl;
 
 /**
@@ -104,7 +110,7 @@ extends AbstractTestCase
         assertEquals( "0\\.1\\.1_Theme/minified/(.*) -> $1,0\\\\.1\\\\.1_Theme/origin/(.*) -> $1", template.getAttribute( ATTR_MAPPING ) );
         assertEquals( "0.1.1", template.getAttribute( ATTR_VERSION ) );
         assertEquals( "0.1.1_Theme/original/*", template.getAttribute( ATTR_COPY ) );
-        assertEquals( "META-INF/*.*", template.getAttribute( ATTR_EXCLUDE ) );
+        assertEquals( "META-INF/*.*;0.1.1_Theme/*.*", template.getAttribute( ATTR_EXCLUDE ) );
     }
 
     /**
@@ -279,6 +285,73 @@ extends AbstractTestCase
     }
 
     /**
+     * 
+     * @throws Exception in case of failure in test
+     */
+    @Test
+    public
+    void
+    test_loadMessage()
+    throws Exception
+    {
+        template.preload( rootDFileMock, models );
+        assertEquals ( "test", template.getMessage( "NAME" ) );
+    }
+    
+    /**
+     * Test {@link DirectoryTemplate#template(IModelProvider, org.tizen.common.verrari.Storage)}
+     * 
+     * @throws Exception in case of failure in test
+     * 
+     * @see DirectoryTemplate#template(IModelProvider, org.tizen.common.verrari.Storage)
+     */
+    @Test
+    public
+    void
+    test_template()
+    throws Exception
+    {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        Storage storageMock = mock( Storage.class );
+        when( storageMock.getTarget( anyString() ) ).thenReturn( out );
+
+        // test (copy)
+        assertTrue( out.size() == 0 );
+        
+        template.template( models, storageMock );
+        assertTrue( out.size() > 0 );
+        byte [] contents = out.toByteArray();
+        String result = new String( contents, 0, contents.length );
+        assertEquals( "TEST ori.js", result );
+        out.reset();
+        assertTrue( out.size() == 0 );
+        
+        // test (templating)
+        /*
+         * test directory template mock setting.
+         * mock directory structure, (d) directory, (f) file
+         * - 0.1.1 (d)
+         *    - config.xml (f)
+         */
+        File configFMock = mock ( File.class );
+        when( configFMock.isDirectory() ).thenReturn( false );
+        when( configFMock.getAbsolutePath() ).thenReturn( "0.1.1/config.xml" );
+        when( configFMock.getParentFile() ).thenReturn( rootDFileMock );
+        when( configFMock.getName() ).thenReturn( "config.xml" );
+        ArrayList<File> array = new ArrayList<File>();
+        array.addAll( Arrays.asList( rootDFileMock.listFiles() ) );
+        array.add( configFMock );
+        File [] files = array.toArray( new File[] {} );
+        when( rootDFileMock.listFiles() ).thenReturn( files );
+
+        template.template( models, storageMock );
+        assertTrue( out.size() > 0 );
+        contents = out.toByteArray();
+        result = new String( contents, 0, contents.length );
+        assertTrue( result.contains("<name>test-id</name>") );
+    }
+    
+    /**
      * Set up test
      * @throws Exception
      */
@@ -348,7 +421,7 @@ extends AbstractTestCase
         rootDFileMock = mock( File.class );
         when( rootDFileMock.isDirectory() ).thenReturn( true );
         when( rootDFileMock.getAbsolutePath() ).thenReturn( "0.1.1" );
-        when( rootDFileMock.listFiles() ).thenReturn( new File [] { themeDMock, metaDMock} );
+        when( rootDFileMock.listFiles() ).thenReturn( new File [] { themeDMock, metaDMock } );
 
         // test mock template class setting
         this.template = new DirectoryTemplate( rootDFileMock ) {
@@ -361,18 +434,22 @@ extends AbstractTestCase
                 {
                     u = new URL( "cp:///web-ui-fw/0.1.1/META-INF/MANIFEST.MF" );
                 }
-                else if ( "messages.properties".equals( name) )
+                else if ( "messages.properties".equals( name ) )
                 {
                     u = new URL( "cp:///web-ui-fw/0.1.1/META-INF/messages.properties" );
                 }
-                else if ( "min.js".equals( name) )
+                else if ( "min.js".equals( name ) )
                 {
                     u = new URL( "cp:///web-ui-fw/0.1.1/0.1.1_Theme/minified/min.js" );
                 }
-                else if ( "ori.js".equals( name) )
+                else if ( "ori.js".equals( name ) )
                 {
                     u = new URL( "cp:///web-ui-fw/0.1.1/0.1.1_Theme/original/ori.js" );
                 }
+                else if ( "config.xml".endsWith( name ) )
+                {
+                       u = new URL( "cp:///web-ui-fw/0.1.1/config.xml" );
+                }
                 return u.openStream();
             }
         };
@@ -456,6 +533,9 @@ extends AbstractTestCase
 
         protected Object inputFromUser( final String key )
         {
+            if ( "WidgetID".equals( key ) ) {
+                return "test-id";
+            }
             // mocking ( It's like user input key "original" )
             return "original";
         }
index 3b1d7fa..fb9f698 100755 (executable)
@@ -2,5 +2,5 @@ Manifest-Version: 1.0
 Tizen-Template-Name: web-ui-fw
 Tizen-Template-Version: 0.1.1
 Tizen-Template-Copy: 0.1.1_Theme/$${SRCOPTIMIZE|'minified'}/*
-Tizen-Template-Exclude: META-INF/*.*
+Tizen-Template-Exclude: META-INF/*.*;0.1.1_Theme/*.*
 Tizen-Template-Mapping: 0\.1\.1_Theme/minified/(.*) -> $1,0\\.1\\.1_Theme/origin/(.*) -> $1
diff --git a/org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/web-ui-fw/0.1.1/config.xml b/org.tizen.common.verrari.realm/test/src/org/tizen/common/verrari/template/web-ui-fw/0.1.1/config.xml
new file mode 100644 (file)
index 0000000..62b2e69
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/$${WidgetID|"WidgetID"}" version="1.0.0" viewmodes="maximized">
+    <tizen:application id="$@{APPID=APPLICATIONID()}.$${WidgetID|"WidgetID"}" package="$${APPID}" required_version="2.1"/>
+    <content src="index.html"/>
+    <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
+    <icon src="icon.png"/>
+    <name>$${WidgetID|"WidgetID"}</name>
+</widget>