java/ch/wlkl/wsh/TraceTester.java

package ch.wlkl.wsh;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class TraceTester extends Tester {
    String name = null;
    String compareHead = null;
    int nameIx = 0;
    HashMap<String, Integer> names = new HashMap<String, Integer>();
    ArrayList<String> java = new ArrayList<String>();

    public TraceTester() {
        super(new StringReader(""));
        compare = new ArrayList<String>();
    }
    
    public void name(String name) {
        nameIx = names.containsKey(name) ? names.get(name) : 0;
        names.put(name, nameIx);
        this.name = name;
//        vars.clear();
        compare.clear();
    }
    
    public void test(String category, String opt, String...srces) {
        String s = name + (++nameIx < 2 ? "" : nameIx) + ' ' + category + " ";
        script.add("test " + s + Strings.quote(opt, "'") + ":");
        compareHead = "--- --- test begin " + s + opt + " >>> " + srces.length + " lines";
        scriptStream("   ", srces);
        script.add(";");
    }

    public void compare(List<String> lines) {
        script.add("compare:");
        ArrayList<String> ll = new ArrayList<String>(); 
        if (lines.size() == 0 || ! lines.get(0).startsWith("--- --- test begin "))
            ll.add(0, "--- --- test begin ");
        ll.addAll(lines);
        ll.set(0, compareHead);
        scriptStream("   ", ll);
        script.add(";");
    }

    public void function(String name, String val, String fun, String... args) {
        script.add(name + " = " + fun + '(');
        scriptStream("   ", args);
        script.add(" );");
        if (val == null) {
            script.add("remove " + name + ";");
            vars.remove(name);
        } else {
            vars.put(name, val);
        }
    }

    public void java(String src) {
        String k = "java('" + name + java.size() + "', " + Strings.quote(src, "'") + ")";
        java.add(k);
        vars.put(k, src);
    }
    public void scriptWrite(String fn) {
        try {
            File f = new File(fn);
            BufferedWriter w = new BufferedWriter(new FileWriter(f));
            for (String s : script) {
                w.write(s);
                w.newLine();
            }
            w.close();
            say("" + script.size() + " lines written to " + f.getAbsolutePath());
        } catch (IOException e) {
            fail("scriptWrite caught " + e);
        }
        
    }
}