Subversion Repositories display

Rev

Rev 360 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2008 Steve Ratcliffe
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

package test.check;

import java.util.ArrayList;
import java.util.List;

import uk.me.parabola.imgfmt.Utils;
import uk.me.parabola.imgfmt.app.Coord;

import test.display.CommonDisplay;
import test.files.RouteCenter;

/**
 * A common class for all check programs.
 *
 * It is intended that the code that reads files and checks them is independent of
 * the code in mkgmap as much as possible. Some of the section reading classes in mkgmap
 * can be used, but in general we shouldn't add functionality to those classes for the
 * sole use of the display project.
 *
 * @author Steve Ratcliffe
 */

public abstract class CommonCheck extends CommonDisplay {

        private boolean verbose;
        private boolean trace;
        private int errorCount;

        private static String ensureNewLine(String fmt) {
                if (fmt.charAt(fmt.length() - 1) == '\n') return fmt;
                else return fmt + '\n';
        }

        /**
         * Print a message as an error.
         */

        protected void error(String fmt, Object... args) {
                errorCount++;
                System.out.printf("ERROR: " + ensureNewLine(fmt), args);
        }

        /**
         * For testing out a hypothesis.  Not counted as an error, but always displayed.
         */

        protected void test(String fmt, Object... args) {
                System.out.printf("TEST: " + ensureNewLine(fmt), args);
        }

        /**
         * Print a message as info, enabled by -v
         */

        protected void info(String fmt, Object... args) {
                if (verbose)
                        System.out.printf(ensureNewLine(fmt), args);
        }

        /**
         * Print a message at the trace level, enabled by -vv.
         */

        protected void trace(String fmt, Object... args) {
                if (trace)
                        System.out.printf(ensureNewLine(fmt), args);
        }

        public void setVerbose(boolean verbose) {
                this.verbose = verbose;
        }

        public void setTrace(boolean trace) {
                this.trace = trace;
        }

        protected String fmtCoord(Coord co) {
                if (co == null)
                        return "NOCOORD";
                return String.format("%.3f,%.3f",
                                Utils.toDegrees(co.getLatitude()), Utils.toDegrees(co.getLongitude()));
        }

        protected static void runMain(Class<? extends CommonCheck> cls, String ext, String[] args) {

                if (args.length < 1) {
                        System.err.printf("Usage: %s -v <filename>", cls.getName());
                        System.exit(1);
                }

                boolean verbose = false;
                boolean trace = false;
                List<String> files = new ArrayList<String>();

                for (String arg : args) {
                        if (arg.equals("-v")) {
                                verbose = true;
                        } else if (arg.startsWith("-vv")) {
                                verbose = true;
                                trace = true;
                        } else if (arg.startsWith("--tab-zero")) {
                                boolean z = true;
                                if (arg.endsWith("=0"))
                                        z = false;
                                RouteCenter.setHasExtraZeros(z);
                        } else {
                                files.add(arg);
                        }
                }

                int totalErrors = 0;

                for (String file : files) {
                        System.out.printf("---------- %s --------------------\n", file);
                        try {
                                CommonCheck check = cls.newInstance();
                                check.setVerbose(verbose);
                                check.setTrace(trace);
                                check.display(file, ext);

                                totalErrors += check.errorCount;

                        } catch (InstantiationException | IllegalAccessException e) {
                                e.printStackTrace();
                        }
                }

                // Print out a summary
                if (totalErrors > 0)
                        System.out.printf("ERROR: total number of errors seen: %d\n", totalErrors);
        }
}