SchubfachWriteBufferTest.java

package tools.jackson.core.unittest.io.schubfach;

import java.nio.charset.StandardCharsets;

import org.junit.jupiter.api.Test;

import tools.jackson.core.io.NumberOutput;

import static org.junit.jupiter.api.Assertions.*;

/**
 * Tests for {@link NumberOutput#outputFloat} and {@link NumberOutput#outputDouble}
 * which write directly to a byte buffer, avoiding String allocation.
 */
public class SchubfachWriteBufferTest
{
    @Test
    public void testWriteFloatBasic()
    {
        float[] values = {
            0.0f, -0.0f, 1.0f, -1.0f, 1.5f, -1.5f,
            123.456f, -123.456f, 1.0E10f, 1.0E-10f,
            Float.MAX_VALUE, Float.MIN_VALUE, Float.MIN_NORMAL,
            Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
        };
        for (float v : values) {
            String expected = NumberOutput.toString(v, true);
            byte[] buf = new byte[32];
            int end = NumberOutput.outputFloat(v, buf, 0);
            String actual = new String(buf, 0, end, StandardCharsets.ISO_8859_1);
            assertEquals(expected, actual, "mismatch for float " + v);
        }
    }

    @Test
    public void testWriteDoubleBasic()
    {
        double[] values = {
            0.0, -0.0, 1.0, -1.0, 1.5, -1.5,
            123.456789, -123.456789, 1.0E10, 1.0E-10,
            Double.MAX_VALUE, Double.MIN_VALUE, Double.MIN_NORMAL,
            Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY
        };
        for (double v : values) {
            String expected = NumberOutput.toString(v, true);
            byte[] buf = new byte[48];
            int end = NumberOutput.outputDouble(v, buf, 0);
            String actual = new String(buf, 0, end, StandardCharsets.ISO_8859_1);
            assertEquals(expected, actual, "mismatch for double " + v);
        }
    }

    @Test
    public void testWriteFloatAtOffset()
    {
        byte[] buf = new byte[32];
        buf[0] = (byte) ',';
        int end = NumberOutput.outputFloat(1.5f, buf, 1);
        String result = new String(buf, 1, end - 1, StandardCharsets.ISO_8859_1);
        assertEquals("1.5", result);
    }

    @Test
    public void testWriteDoubleAtOffset()
    {
        byte[] buf = new byte[48];
        buf[0] = (byte) ',';
        int end = NumberOutput.outputDouble(1.5, buf, 1);
        String result = new String(buf, 1, end - 1, StandardCharsets.ISO_8859_1);
        assertEquals("1.5", result);
    }
}