aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java
blob: 85b32a42f9d4741639ff0b3d50d81d3bc6e7b57e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package cz.crcs.ectester.common.output;

import cz.crcs.ectester.common.cli.Colors;
import cz.crcs.ectester.common.test.*;

import java.io.PrintStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * An absctract basis of a TextTestWriter, which outputs in a human readable format, into console.
 * Requires the implementation of:
 * <code>String testableString(Testable t)</code>
 * <code>String deviceString(TestSuite t)</code>
 *
 * @author Jan Jancar johny@neuromancer.sk
 */
public abstract class BaseTextTestWriter implements TestWriter {
    private PrintStream output;

    public static int BASE_WIDTH = 105;

    public BaseTextTestWriter(PrintStream output) {
        this.output = output;
    }

    @Override
    public void begin(TestSuite suite) {
        output.println("═══ " + Colors.underline("Running test suite:") + " " + Colors.bold(suite.getName()) + " ═══");
        for (String d : suite.getDescription()) {
            output.println("═══ " + d);
        }
        DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        Date date = new Date();
        output.println("═══ " + Colors.underline("Date:") + " " + dateFormat.format(date));
        output.print(deviceString(suite));
    }

    /**
     * @param t
     * @return
     */
    protected abstract String testableString(Testable t);

    /**
     * @param suite
     * @return
     */
    protected abstract String deviceString(TestSuite suite);

    private String testString(Test t, String prefix, int index) {
        boolean compound = t instanceof CompoundTest;

        Result result = t.getResult();

        String line = "";
        if (prefix.equals("")) {
            char charLine[] = new char[BASE_WIDTH + 24];
            new String(new char[BASE_WIDTH + 24]).replace("\0", "━").getChars(0, charLine.length - 1, charLine, 0);
            charLine[0] = '■';
            charLine[4] = '┳';
            charLine[BASE_WIDTH + 1] = '┳';
            charLine[BASE_WIDTH + 13] = '┳';
            charLine[BASE_WIDTH + 23] = '┓';
            line = new String(charLine) + System.lineSeparator();
        }

        StringBuilder out = new StringBuilder();
        out.append(t.ok() ? Colors.ok(" OK ") : Colors.error("NOK "));
        out.append(compound ? (prefix.equals("") ? "╋ " : "┳ ") : "━ ");
        int width = BASE_WIDTH - (prefix.length() + 6);
        String widthSpec = "%-" + String.valueOf(width) + "s";
        String desc = ((prefix.equals("")) ? "(" + index + ") " : "") + t.getDescription();
        out.append(String.format(widthSpec, desc));
        out.append(" ┃ ");
        Colors.Foreground valueColor;
        if (result.getValue().ok()) {
            valueColor = Colors.Foreground.GREEN;
        } else if (result.getValue().equals(Result.Value.ERROR)) {
            valueColor = Colors.Foreground.RED;
        } else {
            valueColor = Colors.Foreground.YELLOW;
        }
        out.append(Colors.colored(String.format("%-9s", result.getValue().name()), Colors.Attribute.BOLD, valueColor));
        out.append(" ┃ ");

        if (compound) {
            CompoundTest test = (CompoundTest) t;
            out.append(String.valueOf(result.getCause()));
            out.append(System.lineSeparator());
            Test[] tests = test.getStartedTests();
            for (int i = 0; i < tests.length; ++i) {
                if (i == tests.length - 1) {
                    out.append(prefix).append("    ┗ ");
                    out.append(testString(tests[i], prefix + "      ", index));
                } else {
                    out.append(prefix).append("    ┣ ");
                    out.append(testString(tests[i], prefix + "    ┃ ", index));
                }

                if (i != tests.length - 1) {
                    out.append(System.lineSeparator());
                }
            }
        } else {
            SimpleTest<? extends BaseTestable> test = (SimpleTest<? extends BaseTestable>) t;
            out.append(testableString(test.getTestable()));
            if (t.getResult().getCause() != null) {
                out.append(" ┃ ").append(t.getResult().getCause().toString());
            }
        }
        return line + out.toString();
    }

    @Override
    public void outputTest(Test t, int index) {
        if (!t.hasRun())
            return;
        output.println(testString(t, "", index));
        output.flush();
    }

    private String errorString(Throwable error) {
        StringBuilder sb = new StringBuilder();
        for (Throwable t = error; t != null; t = t.getCause()) {
            sb.append("═══ ").append(t.toString()).append(" ═══");
            sb.append(System.lineSeparator());
        }
        sb.append("═══ ═══").append(System.lineSeparator());
        for (StackTraceElement s : error.getStackTrace()) {
            sb.append("═══ ").append(s.toString()).append(" ═══");
            sb.append(System.lineSeparator());
        }
        return sb.toString();
    }

    @Override
    public void outputError(Test t, Throwable cause, int index) {
        output.println(testString(t, "", index));
        output.print(errorString(cause));
        output.flush();
    }

    @Override
    public void end() {
    }
}