    // Sun stack with two extra frames on the top and NO
    // recordTraceMessage in the rest.. (unlikely)
    public void testStackShuffledFramesSun() {
        String msg = 
            "java.lang.Exception\n"+
            "\tat org.erights.e.develop.trace.Trace.recordTraceMessageXyzzY(Trace.java, Compiled Code)\n"+
            "\tat java.lang.Exception.<init>(Exception.java, Compiled Code)\n"+
            "\tat org.erights.e.develop.trace.TraceMessage.<init>(TraceMessage.java, Compiled Code)\n"+
            "\tat org.erights.e.develop.trace.Trace.worldm(Trace.java, Compiled Code)\n"+
            "\tat Threadzilla.run(Threadzilla.java, Compiled Code)";
        TraceCaller tc = new TraceCaller(msg);
        assert(tc.methodName.equals("method?"));
        assert(tc.fileName.equals("file?"));
        assert(tc.lineNumber.equals("line?"));
    }


    // Standard trace message, Sun stack.
    // There is no exception header.
    public void testStackWalkMissingHeader() {
        String msg = 
            "\tat org.erights.e.develop.trace.TraceMessage.<init>(TraceMessage.java, Compiled Code)\n"+
            "\tat org.erights.e.develop.trace.Trace.recordTraceMessageXyzzY(Trace.java, Compiled Code)\n"+
            "\tat org.erights.e.develop.trace.Trace.worldm(Trace.java, Compiled Code)\n"+
            "\tat Threadzilla.run(Threadzilla.java, Compiled Code)";
        TraceCaller tc = new TraceCaller(msg);
        assert(tc.methodName.equals("Threadzilla.run"));
        assert(tc.fileName.equals("Threadzilla.java"));
        assert(tc.lineNumber.equals("line?"));
    }


    // Standard trace message, Sun stack.
    // The normal exception header is different, also uses CRLFs.
    public void testStackWalkDifferentHeader() {
        String msg = 
            "We are here in exception land\r\n"+
            "Here are the contents...\r\n"+
            "\tat org.erights.e.develop.trace.TraceMessage.<init>(TraceMessage.java, Compiled Code)\r\n"+
            "\tat org.erights.e.develop.trace.Trace.recordTraceMessageXyzzY(Trace.java, Compiled Code)\r\n"+
            "\tat org.erights.e.develop.trace.Trace.worldm(Trace.java, Compiled Code)\r\n"+
            "\tat Threadzilla.run(Threadzilla.java, Compiled Code)";
        TraceCaller tc = new TraceCaller(msg);
        assert(tc.methodName.equals("Threadzilla.run"));
        assert(tc.fileName.equals("Threadzilla.java"));
        assert(tc.lineNumber.equals("line?"));
    }


    // Standard trace message, Sun stack.
    // There is no exception header, and everything in the stack above
    // the recordTraceMessage is lost. It's ok that 
    // location information is lost, as I know of no VM that does this.
    public void testStackWalkMissingHeaderAndTop() {
        String msg = 
            "\tat org.erights.e.develop.trace.Trace.recordTraceMessageXyzzY(Trace.java, Compiled Code)\n"+
            "\tat org.erights.e.develop.trace.Trace.worldm(Trace.java, Compiled Code)\n"+
            "\tat Threadzilla.run(Threadzilla.java, Compiled Code)";
        TraceCaller tc = new TraceCaller(msg);
        assert(tc.methodName.equals("method?"));
        assert(tc.fileName.equals("file?"));
        assert(tc.lineNumber.equals("line?"));
    }


