/* * 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 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. * * * Author: Steve Ratcliffe * Create date: 10-Jan-2009 */ package func.lib; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Deque; import java.util.List; import uk.me.parabola.imgfmt.Utils; import uk.me.parabola.mkgmap.general.LevelInfo; import uk.me.parabola.mkgmap.main.Main; import uk.me.parabola.mkgmap.osmstyle.RuleFileReader; import uk.me.parabola.mkgmap.osmstyle.RuleSet; import uk.me.parabola.mkgmap.osmstyle.StyleFileLoader; import uk.me.parabola.mkgmap.reader.osm.FeatureKind; import static org.junit.Assert.*; /** * Useful routines to use during the functional tests. * * @author Steve Ratcliffe */ public class TestUtils { private static final List<String> files = new ArrayList<String>(); private static final Deque<Closeable> open = new ArrayDeque<Closeable>(); static { files.add(Args.DEF_MAP_FILENAME); files.add(Args.DEF_MAP_FILENAME2); files.add(Args.DEF_GMAPSUPP_FILENAME); files.add(Args.DEF_TDB_FILENAME); Runnable r = new Runnable() { public void run() { deleteOutputFiles(); } }; Thread t = new Thread(r); Runtime.getRuntime().addShutdownHook(t); } /** * Delete output files that were created by the tests. * Used to clean up before/after a test. */ public static void deleteOutputFiles() { for (String fname : files) { File f = new File(fname); if (f.exists()) assertTrue("delete existing file: " + f.getName(), f.delete()); } } public static void closeFiles() { while (!open.isEmpty()) Utils.closeFile(open.remove()); } public static void registerFile(String ... names) { Collections.addAll(files, names); } public static void registerFile(Closeable... files) { Collections.addAll(open, files); } /** * Run with a single argument. The standard arguments are added first. * @param arg The argument. */ public static Outputs run(String arg) { return run(new String[] {arg}); } /** * Run with the given args. Some standard arguments are added first. * * To run without the standard args, use runRaw(). * @param in The arguments to use. */ public static Outputs run(String ... in) { List<String> args = new ArrayList<String>(Arrays.asList(in)); args.add(0, Args.TEST_STYLE_ARG); OutputStream outsink = new ByteArrayOutputStream(); PrintStream out = new PrintStream(outsink); OutputStream errsink = new ByteArrayOutputStream(); PrintStream err = new PrintStream(errsink); PrintStream origout = System.out; PrintStream origerr = System.err; try { System.setOut(out); System.setErr(err); Main.mainNoSystemExit(args.toArray(new String[args.size()])); } finally { out.close(); err.close(); System.setOut(origout); System.setErr(origerr); } return new Outputs(outsink.toString(), errsink.toString()); } /** * Create a rule set out of a string. The string is processed * as if it were in a file and the levels spec had been set. */ public static RuleSet makeRuleSet(String in) { StringStyleFileLoader loader = new StringStyleFileLoader(new String[][] { {"lines", in} }); return makeRuleSet(loader); } /** * Make a rule set from the "lines" file of the given StyleFileLoader. * * @param loader This will be used to load the file 'lines'. If that file includes any other file, then it * should accessible from the loader too. * * @return A rule set for lines. */ public static RuleSet makeRuleSet(StyleFileLoader loader) { RuleSet rs = new RuleSet(); RuleFileReader rr = new RuleFileReader(FeatureKind.POLYLINE, LevelInfo.createFromString("0:24 1:20 2:18 3:16 4:14"), rs, false, null); try { rr.load(loader, "lines"); } catch (FileNotFoundException e) { throw new AssertionError("Failed to open file: lines"); } return rs; } }