/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2007, Geotools Project Managment Committee (PMC)
 *    (C) 2007, Geomatys
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License as published by the Free Software Foundation; either
 *    version 2.1 of the License, or (at your option) any later version.
 *
 *    This library 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
 *    Lesser General Public License for more details.
 */
package org.geotools.image.io.text;

import java.io.StringWriter;
import java.util.Locale;
import java.io.IOException;
import java.util.StringTokenizer;
import javax.imageio.IIOImage;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.WritableRaster;
import java.text.FieldPosition;
import java.text.NumberFormat;

import org.geotools.image.io.PaletteFactory;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;


/**
 * Tests {@link TextMatrixImageWriter}.
 *
 * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/unsupported/coverageio/src/test/java/org/geotools/image/io/text/TextMatrixImageWriterTest.java $
 * @version $Id: TextMatrixImageWriterTest.java 27848 2007-11-12 13:10:32Z desruisseaux $
 * @author Martin Desruisseaux
 */
public class TextMatrixImageWriterTest extends TestCase {
    /**
     * The image to test.
     */
    private static IIOImage image;

    /**
     * The writer to test.
     */
    private static TextMatrixImageWriter writer;

    /**
     * Run the suite from the command line.
     */
    public static void main(final String[] args) {
        org.geotools.util.logging.Logging.GEOTOOLS.forceMonolineConsoleOutput();
        junit.textui.TestRunner.run(suite());
    }

    /**
     * Returns the test suite.
     */
    public static Test suite() {
        return new TestSuite(TextMatrixImageWriterTest.class);
    }

    /**
     * Constructs a test case with the given name.
     */
    public TextMatrixImageWriterTest(final String name) {
        super(name);
    }

    /**
     * Creates the image to test.
     */
    protected void setUp() throws IOException {
        if (image != null) {
            return;
        }
        final int width  = 8;
        final int height = 10;
        final ColorModel cm = PaletteFactory.getDefault().getContinuousPalette(
                "grayscale", 0f, 1f, DataBuffer.TYPE_FLOAT, 1, 0).getColorModel();
        final WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
        for (int y=0; y<height; y++) {
            for (int x=0; x<width; x++) {
                double value = (10*y + x) / 100.0;
                if (y >= 5) {
                    value += 88;
                }
                raster.setSample(x, y, 0, value);
            }
        }
        image = new IIOImage(new BufferedImage(cm, raster, false, null), null, null);
        TextMatrixImageWriter.Spi spi = new TextMatrixImageWriter.Spi();
        spi.locale = Locale.CANADA;
        writer = new TextMatrixImageWriter(spi);
    }

    /**
     * Tests the number format.
     */
    public void testCreateNumberFormat() {
        assertEquals(Locale.CANADA, writer.getDataLocale(null));

        final NumberFormat format = writer.createNumberFormat(image, null);
        assertEquals(2, format.getMinimumFractionDigits());
        assertEquals(2, format.getMaximumFractionDigits());
        assertEquals(1, format.getMinimumIntegerDigits());
        assertEquals( "0.12", format.format( 0.1216));
        assertEquals("-0.30", format.format(-0.2978));

        final FieldPosition pos = writer.getExpectedFractionPosition(format);
        assertEquals("Field type", NumberFormat.FRACTION_FIELD, pos.getField());
        assertEquals("Fraction width", 2, pos.getEndIndex() - pos.getBeginIndex());
        assertEquals("Total width (including sign)", 6, pos.getEndIndex());
    }

    /**
     * Tests the write operation.
     */
    public void testWrite() throws IOException {
        final StringWriter out = new StringWriter();
        writer.setOutput(out);
        writer.write(image);
        out.close();
        final StringTokenizer tokens = new StringTokenizer(out.toString());
        while (tokens.hasMoreTokens()) {
            final String t = tokens.nextToken();
            final int dot = t.indexOf('.');
            assertTrue(dot >= 0);
            assertEquals(3, t.length() - dot);
            final float value = Float.parseFloat(t);
            assertTrue(value>=0 && value<100);
        }
    }
}
