/**
 * jetbrick-template
 * http://subchen.github.io/jetbrick-template/
 *
 * Copyright 2010-2013 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package testcase;

import java.io.*;
import java.net.URL;
import java.util.*;
import jetbrick.template.*;
import jetbrick.template.compiler.JdtCompiler;
import jetbrick.template.resource.loader.ClasspathResourceLoader;
import jetbrick.template.utils.*;

public class JetEngineTestCase {
    private static final JetEngine engine = getJetEngine();
    private static Map<String, Object> context = getContext();

    private static JetEngine getJetEngine() {
        Properties config = new Properties();
        config.put(JetConfig.IMPORT_PACKAGES, "testcase.model.*");
        config.put(JetConfig.IMPORT_VARIABLES, "User user, Book book");
        config.put(JetConfig.IMPORT_TAGS, TagUtils.class.getName());
        //config.put(JetConfig.OUTPUT_ENCODING, "GBK");
        config.put(JetConfig.TEMPLATE_LOADER, ClasspathResourceLoader.class.getName());
        config.put(JetConfig.TEMPLATE_PATH, "/");
        //config.put(JetConfig.COMPILE_ALWAYS, "false");
        config.put(JetConfig.COMPILE_TOOL, JdtCompiler.class.getName());
        config.put(JetConfig.COMPILE_DEBUG, "true");
        config.put(JetConfig.TRIM_DIRECTIVE_COMMENTS, "true");
        return JetEngine.create(config);
    }

    private static Map<String, Object> getContext() {
        Map<String, Object> context = new HashMap<String, Object>();
        testcase.model.User user = testcase.model.User.newInstance();
        context.put("user", user);
        context.put("book", user.getBookList().get(0));
        context.put("array", new int[] { 1, 2, 3 });
        context.put("items", new String[] { "a", "b", "c" });
        return context;
    }

    private static void render(String name, OutputStream out) {
        JetTemplate template = engine.getTemplate(name);
        template.render(context, out);
    }

    private static void testSuccessfully() throws IOException {
        URL url = ClassLoaderUtils.getContextClassLoader().getResource("template");
        File path = URLUtils.toFileObject(url);

        for (File file : path.listFiles()) {
            if (file.getName().endsWith(".jetx")) {
                String name = "/template/" + file.getName();

                UnsafeByteArrayOutputStream out = new UnsafeByteArrayOutputStream();
                render(name, out);
                String out_contents = out.toString("utf-8");
                out_contents = out_contents.replaceAll("\r", "");

                if (name.endsWith("-ignore.jetx")) continue;

                File outputFile = new File(path, file.getName() + ".txt");
                String contents = new String(IoUtils.toCharArray(outputFile, "utf-8"));
                contents = contents.replaceAll("\r", "");

                if (!contents.equals(out_contents)) {
                    System.err.println("ASSERT ERROR: " + name);
                    System.err.println("length: get = " + out_contents.length() + ", expect: " + contents.length());
                    System.err.println("==========================================");
                    System.err.println(out_contents);
                    System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                    System.err.println(contents);
                    System.exit(1);
                }
            }
        }
    }

    public static void main(String[] args) throws Throwable {
        if (args.length > 0) {
            render(args[0], System.out);
            return;
        }

        long ts = System.currentTimeMillis();

        testSuccessfully();

        System.out.println();
        System.out.println("total: " + (System.currentTimeMillis() - ts));
        //System.in.read();
    }
}

@@ -825,55 +825,8 @@
 .*;%0A
-import jetbrick.template.compiler.JdtCompiler;%0A
 impo
@@ -1630,32 +1630,34 @@
 alse%22);%0A        
+//
 config.put(JetCo

Update testcase