Package net.thucydides.core.output

Source Code of net.thucydides.core.output.SpreadsheetResultsOutput

package net.thucydides.core.output;

import com.google.common.collect.ImmutableList;
import jxl.JXLException;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Colour;
import jxl.read.biff.BiffException;
import jxl.write.*;
import net.thucydides.core.matchers.SimpleValueMatcher;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class SpreadsheetResultsOutput implements ResultsOutput {
    List<String> titles;
    File outputFile;
    boolean recordingStarted;

    public SpreadsheetResultsOutput(File outputFile, List<String> titles) {
        this.titles = ImmutableList.copyOf(titles);
        this.outputFile = outputFile;
        recordingStarted = false;

    }

    @Override
    public synchronized void recordResult(List<? extends Object> columnValues,
                                          SimpleValueMatcher... validityChecks) throws IOException {

        WritableWorkbook workbook = null;

        try {
            workbook = currentWorkbook();
            writeRow(columnValues, workbook.getSheet(0), validityChecks);
            workbook.write();
        } catch (JXLException e) {
            throw new IOException(e);
        } finally {
            close(workbook);
        }
    }

    private void close(WritableWorkbook workbook) throws IOException {
        try {
            if (workbook != null) {
                workbook.close();
            }
        } catch (WriteException ignoredException) {}
    }

    private void writeRow(List<? extends Object> columnValues,
                          WritableSheet sheet,
                          SimpleValueMatcher... checks) throws WriteException {

        recordingStarted = true;

        boolean isAFailedTest = checkIfTestHasFailed(checks);
        WritableCellFormat font = getFontFor(isAFailedTest);

        int row = sheet.getRows();
        int column = 0;
        for (Object columnValue : columnValues) {
            Label resultCell = new Label(column++, row, columnValue.toString(), font);
            sheet.addCell(resultCell);
        }
    }

    private boolean checkIfTestHasFailed(SimpleValueMatcher[] checks) {
        boolean isAFailedTest = false;
        for(SimpleValueMatcher check : checks) {
            if (!check.matches()) {
                isAFailedTest = true;
            }
        }
        return isAFailedTest;
    }

    private WritableCellFormat getFontFor(boolean aFailedTest) throws WriteException {
        WritableFont baseFont = new WritableFont(WritableFont.ARIAL, 10);
        if (aFailedTest) {
            baseFont.setBoldStyle(WritableFont.BOLD);
            baseFont.setColour(Colour.RED);
        }
        return new WritableCellFormat(baseFont);
    }

    private WritableWorkbook currentWorkbook() throws IOException, BiffException {
        WritableWorkbook workbook;
        if (!recordingStarted || !outputFile.exists()) {
            workbook = createNewSpreadSheet(outputFile);
        } else {
            workbook = openExistingSpreadsheet();
        }
        return workbook;
    }

    private WritableWorkbook openExistingSpreadsheet() throws BiffException, IOException {
        return Workbook.createWorkbook(outputFile, Workbook.getWorkbook(outputFile));
    }

    private WritableWorkbook createNewSpreadSheet(File outputFile) throws IOException {
        try {
            WorkbookSettings wbSettings = new WorkbookSettings();
            wbSettings.setLocale(new Locale("en", "EN"));

            WritableWorkbook workbook = Workbook.createWorkbook(outputFile, wbSettings);
            workbook.createSheet("Test Results", 0);
            WritableSheet sheet = workbook.getSheet(0);

            int cellIndex = 0;
            for (String title : titles) {
                Label label = new Label(cellIndex++, 0, title);
                sheet.addCell(label);
            }
            return workbook;
        } catch (JXLException e) {
            throw new IOException(e);
        }
    }
}
TOP

Related Classes of net.thucydides.core.output.SpreadsheetResultsOutput

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.