// Path: moshas/src/main/java/net/unit8/moshas/context/Context.java
// public class Context extends AbstractContext {
// 
//     public Context() {
//         super();
//     }
// 
//     public Context(Map<String, Object> variables) {
//         super();
//         for (Map.Entry<String, Object> entry : variables.entrySet()) {
//             setVariable(entry.getKey(), entry.getValue());
//         }
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/ResourceTemplateLoader.java
// public class ResourceTemplateLoader extends TemplateLoader {
//     private String prefix;
//     private String suffix;
// 
//     @Override
//     public InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException {
//         ClassLoader cl = Thread.currentThread().getContextClassLoader();
//         if (cl == null) {
//             cl = getClass().getClassLoader();
//         }
// 
//         if (prefix != null) {
//             templateSource = prefix + templateSource;
//         }
//         if (suffix != null) {
//             templateSource = templateSource + suffix;
//         }
// 
//         if (templateSource.startsWith("/")) {
//             templateSource = templateSource.replaceAll("^/(.*)", "$1");
//         }
//         InputStream is = cl.getResourceAsStream(templateSource);
//         if (is == null) {
//             throw new TemplateNotFoundException("Can't find template " + templateSource);
//         }
// 
//         return is;
//     }
// 
//     public void setPrefix(String prefix) {
//         this.prefix = prefix;
//     }
// 
//     public void setSuffix(String suffix) {
//         this.suffix = suffix;
//     }
// }


import net.unit8.moshas.context.Context;
import net.unit8.moshas.loader.ResourceTemplateLoader;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
                        el.attr("class", "minus");
                    }
                    el.text(ctx.getString("stock", "ratio"));
                });

            });

            t.select("tbody", (el, ctx) -> {
                el.empty();
                AtomicInteger counter = new AtomicInteger(0);
                ctx.getCollection("items").forEach(item -> ctx.localScope("stock", item, "itemIndex", counter.incrementAndGet(), () -> {
                    el.appendChild(stockSnippet.render(ctx));
                }));
            });

        });
    }

    protected Map<String, Object> getContext() {
        Map<String, Object> ctx = new HashMap<>();
        ctx.put("items", Stock.dummyItems());
        return ctx;
    }

    @Test
    public void benchmark() throws IOException, InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(100);

        for (int i=0; i<100; i++) {
            service.execute(() -> {
// Path: moshas/src/main/java/net/unit8/moshas/context/Context.java
// public class Context extends AbstractContext {
// 
//     public Context() {
//         super();
//     }
// 
//     public Context(Map<String, Object> variables) {
//         super();
//         for (Map.Entry<String, Object> entry : variables.entrySet()) {
//             setVariable(entry.getKey(), entry.getValue());
//         }
//     }
// }
// 
// Path: moshas/src/main/java/net/unit8/moshas/loader/ResourceTemplateLoader.java
// public class ResourceTemplateLoader extends TemplateLoader {
//     private String prefix;
//     private String suffix;
// 
//     @Override
//     public InputStream getTemplateStream(String templateSource) throws TemplateNotFoundException {
//         ClassLoader cl = Thread.currentThread().getContextClassLoader();
//         if (cl == null) {
//             cl = getClass().getClassLoader();
//         }
// 
//         if (prefix != null) {
//             templateSource = prefix + templateSource;
//         }
//         if (suffix != null) {
//             templateSource = templateSource + suffix;
//         }
// 
//         if (templateSource.startsWith("/")) {
//             templateSource = templateSource.replaceAll("^/(.*)", "$1");
//         }
//         InputStream is = cl.getResourceAsStream(templateSource);
//         if (is == null) {
//             throw new TemplateNotFoundException("Can't find template " + templateSource);
//         }
// 
//         return is;
//     }
// 
//     public void setPrefix(String prefix) {
//         this.prefix = prefix;
//     }
// 
//     public void setSuffix(String suffix) {
//         this.suffix = suffix;
//     }
// }


// Path: moshas/src/test/java/net/unit8/moshas/LoopTemplateTest.java
import net.unit8.moshas.context.Context;
import net.unit8.moshas.loader.ResourceTemplateLoader;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

                        el.attr("class", "minus");
                    }
                    el.text(ctx.getString("stock", "ratio"));
                });

            });

            t.select("tbody", (el, ctx) -> {
                el.empty();
                AtomicInteger counter = new AtomicInteger(0);
                ctx.getCollection("items").forEach(item -> ctx.localScope("stock", item, "itemIndex", counter.incrementAndGet(), () -> {
                    el.appendChild(stockSnippet.render(ctx));
                }));
            });

        });
    }

    protected Map<String, Object> getContext() {
        Map<String, Object> ctx = new HashMap<>();
        ctx.put("items", Stock.dummyItems());
        return ctx;
    }

    @Test
    public void benchmark() throws IOException, InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(100);

        for (int i=0; i<100; i++) {
            service.execute(() -> {
                Context context = new Context(getContext());